diff options
Diffstat (limited to 'src')
228 files changed, 4960 insertions, 2600 deletions
diff --git a/src/devices/bus/a2bus/agat7ports.cpp b/src/devices/bus/a2bus/agat7ports.cpp index aee242fb6fb..a2d8e8b81cc 100644 --- a/src/devices/bus/a2bus/agat7ports.cpp +++ b/src/devices/bus/a2bus/agat7ports.cpp @@ -122,14 +122,7 @@ uint8_t a2bus_agat7_ports_device::read_c0nx(uint8_t offset) break; case 8: - if (offset & 1) - { - data = m_d10->status_r(machine().dummy_space(), 0); - } - else - { - data = m_d10->data_r(machine().dummy_space(), 0); - } + data = m_d10->read(offset & 1); break; } @@ -150,14 +143,7 @@ void a2bus_agat7_ports_device::write_c0nx(uint8_t offset, uint8_t data) break; case 8: - if (offset & 1) - { - m_d10->control_w(machine().dummy_space(), 0, data); - } - else - { - m_d10->data_w(machine().dummy_space(), 0, data); - } + m_d10->write(offset & 1, data); break; } } diff --git a/src/devices/bus/acorn/atom/discpack.cpp b/src/devices/bus/acorn/atom/discpack.cpp index 8d795e5ac4b..63a29d403f1 100644 --- a/src/devices/bus/acorn/atom/discpack.cpp +++ b/src/devices/bus/acorn/atom/discpack.cpp @@ -34,7 +34,7 @@ static void atom_floppies(device_slot_interface &device) ROM_START( discpack ) ROM_REGION(0x1000, "dos_rom", 0) - ROM_LOAD("dosrom.ic18", 0x0000, 0x1000, CRC(c431a9b7) SHA1(71ea0a4b8d9c3caf9718fc7cc279f4306a23b39c)) + ROM_LOAD("dosrom.ic15", 0x0000, 0x1000, CRC(c431a9b7) SHA1(71ea0a4b8d9c3caf9718fc7cc279f4306a23b39c)) ROM_END //------------------------------------------------- @@ -43,14 +43,12 @@ ROM_END void atom_discpack_device::device_add_mconfig(machine_config &config) { - I8271(config, m_fdc, 0); + I8271(config, m_fdc, 4_MHz_XTAL / 2); m_fdc->intrq_wr_callback().set(FUNC(atom_discpack_device::fdc_intrq_w)); m_fdc->hdl_wr_callback().set(FUNC(atom_discpack_device::motor_w)); m_fdc->opt_wr_callback().set(FUNC(atom_discpack_device::side_w)); - FLOPPY_CONNECTOR(config, m_floppy[0], atom_floppies, "525sssd", atom_discpack_device::floppy_formats); - m_floppy[0]->enable_sound(true); - FLOPPY_CONNECTOR(config, m_floppy[1], atom_floppies, nullptr, atom_discpack_device::floppy_formats); - m_floppy[1]->enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy[0], atom_floppies, "525sssd", atom_discpack_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy[1], atom_floppies, nullptr, atom_discpack_device::floppy_formats).enable_sound(true); } @@ -102,6 +100,7 @@ WRITE_LINE_MEMBER(atom_discpack_device::motor_w) { if (m_floppy[0]->get_device()) m_floppy[0]->get_device()->mon_w(!state); if (m_floppy[1]->get_device()) m_floppy[1]->get_device()->mon_w(!state); + m_fdc->ready_w(!state); } WRITE_LINE_MEMBER(atom_discpack_device::side_w) diff --git a/src/devices/bus/acorn/system/fdc.cpp b/src/devices/bus/acorn/system/fdc.cpp index 61fd022f335..398736eab9e 100644 --- a/src/devices/bus/acorn/system/fdc.cpp +++ b/src/devices/bus/acorn/system/fdc.cpp @@ -42,14 +42,12 @@ static void acorn_floppies(device_slot_interface &device) void acorn_fdc_device::device_add_mconfig(machine_config &config) { - I8271(config, m_fdc, 0); + I8271(config, m_fdc, 4_MHz_XTAL / 2); m_fdc->intrq_wr_callback().set(FUNC(acorn_fdc_device::bus_nmi_w)); m_fdc->hdl_wr_callback().set(FUNC(acorn_fdc_device::motor_w)); m_fdc->opt_wr_callback().set(FUNC(acorn_fdc_device::side_w)); - FLOPPY_CONNECTOR(config, m_floppy[0], acorn_floppies, "525qd", acorn_fdc_device::floppy_formats); - m_floppy[0]->enable_sound(true); - FLOPPY_CONNECTOR(config, m_floppy[1], acorn_floppies, "525qd", acorn_fdc_device::floppy_formats); - m_floppy[1]->enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy[0], acorn_floppies, "525qd", acorn_fdc_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy[1], acorn_floppies, "525qd", acorn_fdc_device::floppy_formats).enable_sound(true); } @@ -99,6 +97,7 @@ WRITE_LINE_MEMBER(acorn_fdc_device::motor_w) { if (m_floppy[0]->get_device()) m_floppy[0]->get_device()->mon_w(!state); if (m_floppy[1]->get_device()) m_floppy[1]->get_device()->mon_w(!state); + m_fdc->ready_w(!state); } WRITE_LINE_MEMBER(acorn_fdc_device::side_w) diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp index 6fa2407aae7..06458b4d748 100644 --- a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp +++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp @@ -33,16 +33,6 @@ device_bbc_1mhzbus_interface::device_bbc_1mhzbus_interface(const machine_config } -//------------------------------------------------- -// ~device_bbc_1mhzbus_interface - destructor -//------------------------------------------------- - -device_bbc_1mhzbus_interface::~device_bbc_1mhzbus_interface() -{ -} - - - //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -62,15 +52,6 @@ bbc_1mhzbus_slot_device::bbc_1mhzbus_slot_device(const machine_config &mconfig, //------------------------------------------------- -// bbc_1mhzbus_slot_device - destructor -//------------------------------------------------- - -bbc_1mhzbus_slot_device::~bbc_1mhzbus_slot_device() -{ -} - - -//------------------------------------------------- // device_validity_check - //------------------------------------------------- @@ -107,10 +88,40 @@ void bbc_1mhzbus_slot_device::device_reset() { } -WRITE_LINE_MEMBER(bbc_1mhzbus_slot_device::rst_w) +//------------------------------------------------- +// read +//------------------------------------------------- + +READ8_MEMBER(bbc_1mhzbus_slot_device::fred_r) +{ + if (m_card) + return m_card->fred_r(space, offset); + else + return 0xff; +} + +READ8_MEMBER(bbc_1mhzbus_slot_device::jim_r) +{ + if (m_card) + return m_card->jim_r(space, offset); + else + return 0xff; +} + +//------------------------------------------------- +// write +//------------------------------------------------- + +WRITE8_MEMBER(bbc_1mhzbus_slot_device::fred_w) +{ + if (m_card) + m_card->fred_w(space, offset, data); +} + +WRITE8_MEMBER(bbc_1mhzbus_slot_device::jim_w) { if (m_card) - m_card->rst_w(state); + m_card->jim_w(space, offset, data); } //------------------------------------------------- @@ -122,6 +133,7 @@ WRITE_LINE_MEMBER(bbc_1mhzbus_slot_device::rst_w) //#include "teletext.h" //#include "ieee488.h" //#include "m5000.h" +//#include "scsi.h" //#include "multiform.h" #include "opus3.h" //#include "ramdisc.h" @@ -135,15 +147,17 @@ void bbc_1mhzbus_devices(device_slot_interface &device) { // device.option_add("teletext", BBC_TELETEXT); /* Acorn ANE01 Teletext Adapter */ // device.option_add("ieee488", BBC_IEEE488); /* Acorn ANK01 IEEE488 Interface */ -// device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */ + //device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */ + //device.option_add("awdd", BBC_AWDD); /* Acorn Winchester 110/130 */ +//..device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */ // device.option_add("m2000", BBC_M2000); /* Hybrid Music 2000 MIDI Interface */ -// device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */ -// device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */ -// device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */ + //device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */ + //device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */ + //device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */ device.option_add("opus3", BBC_OPUS3); /* Opus Challenger 3 */ -// device.option_add("ramdisc", BBC_RAMDISC); /* Morley Electronics RAM Disc */ -// device.option_add("graduate", BBC_GRADUATE); /* The Torch Graduate G400/G800 */ + //device.option_add("ramdisc", BBC_RAMDISC); /* Morley Electronics RAM Disc */ + //device.option_add("graduate", BBC_GRADUATE); /* The Torch Graduate G400/G800 */ device.option_add("beebsid", BBC_BEEBSID); /* BeebSID */ -// device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */ + //device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */ device.option_add("cfa3000opt", CFA3000_OPT); /* Henson CFA 3000 Option Board */ } diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.h b/src/devices/bus/bbc/1mhzbus/1mhzbus.h index 15e4721e556..c1229718494 100644 --- a/src/devices/bus/bbc/1mhzbus/1mhzbus.h +++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.h @@ -80,33 +80,6 @@ //************************************************************************** -// CONSTANTS -//************************************************************************** - -#define BBC_1MHZBUS_SLOT_TAG "1mhzbus" - - -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_BBC_1MHZBUS_SLOT_ADD(_tag, _slot_intf, _def_slot) \ - MCFG_DEVICE_ADD(_tag, BBC_1MHZBUS_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) - -#define MCFG_BBC_PASSTHRU_1MHZBUS_SLOT_ADD() \ - MCFG_BBC_1MHZBUS_SLOT_ADD(BBC_1MHZBUS_SLOT_TAG, bbc_1mhzbus_devices, nullptr) \ - MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_1mhzbus_slot_device, irq_w)) \ - MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_1mhzbus_slot_device, nmi_w)) - -#define MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(_devcb) \ - downcast<bbc_1mhzbus_slot_device &>(*device).set_irq_handler(DEVCB_##_devcb); - -#define MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(_devcb) \ - downcast<bbc_1mhzbus_slot_device &>(*device).set_nmi_handler(DEVCB_##_devcb); - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -118,14 +91,27 @@ class bbc_1mhzbus_slot_device : public device_t, public device_slot_interface { public: // construction/destruction - bbc_1mhzbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~bbc_1mhzbus_slot_device(); + template <typename T> + bbc_1mhzbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option) + : bbc_1mhzbus_slot_device(mconfig, tag, owner) + { + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(false); + } + + bbc_1mhzbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); // callbacks - template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_nmi_handler(Object &&cb) { return m_nmi_handler.set_callback(std::forward<Object>(cb)); } + auto irq_handler() { return m_irq_handler.bind(); } + auto nmi_handler() { return m_nmi_handler.bind(); } + + virtual DECLARE_READ8_MEMBER(fred_r); + virtual DECLARE_WRITE8_MEMBER(fred_w); + virtual DECLARE_READ8_MEMBER(jim_r); + virtual DECLARE_WRITE8_MEMBER(jim_w); - DECLARE_WRITE_LINE_MEMBER( rst_w ); DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); } DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); } @@ -148,10 +134,10 @@ private: class device_bbc_1mhzbus_interface : public device_slot_card_interface { public: - // construction/destruction - virtual ~device_bbc_1mhzbus_interface(); - - virtual DECLARE_WRITE_LINE_MEMBER(rst_w) { } + virtual DECLARE_READ8_MEMBER(fred_r) { return 0xff; } + virtual DECLARE_WRITE8_MEMBER(fred_w) { } + virtual DECLARE_READ8_MEMBER(jim_r) { return 0xff; } + virtual DECLARE_WRITE8_MEMBER(jim_w) { } protected: device_bbc_1mhzbus_interface(const machine_config &mconfig, device_t &device); diff --git a/src/devices/bus/bbc/1mhzbus/beebsid.cpp b/src/devices/bus/bbc/1mhzbus/beebsid.cpp index c2e9509b658..1906914840b 100644 --- a/src/devices/bus/bbc/1mhzbus/beebsid.cpp +++ b/src/devices/bus/bbc/1mhzbus/beebsid.cpp @@ -13,13 +13,6 @@ //************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define MOS8580_TAG "mos8580" - - -//************************************************************************** // DEVICE DEFINITIONS //************************************************************************** @@ -30,13 +23,16 @@ DEFINE_DEVICE_TYPE(BBC_BEEBSID, bbc_beebsid_device, "beebsid", "BeebSID") // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(bbc_beebsid_device::device_add_mconfig) +void bbc_beebsid_device::device_add_mconfig(machine_config &config) +{ SPEAKER(config, "speaker").front_center(); - MCFG_DEVICE_ADD(MOS8580_TAG, MOS8580, XTAL(16'000'000) / 16) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) + MOS8580(config, m_sid, 16_MHz_XTAL / 16); + m_sid->add_route(ALL_OUTPUTS, "speaker", 1.0); - MCFG_BBC_PASSTHRU_1MHZBUS_SLOT_ADD() -MACHINE_CONFIG_END + BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbc_1mhzbus_devices, nullptr); + m_1mhzbus->irq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::irq_w)); + m_1mhzbus->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::nmi_w)); +} //************************************************************************** @@ -50,7 +46,8 @@ MACHINE_CONFIG_END bbc_beebsid_device::bbc_beebsid_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, BBC_BEEBSID, tag, owner, clock), device_bbc_1mhzbus_interface(mconfig, *this), - m_sid(*this, MOS8580_TAG) + m_1mhzbus(*this, "1mhzbus"), + m_sid(*this, "mos8580") { } @@ -61,7 +58,47 @@ bbc_beebsid_device::bbc_beebsid_device(const machine_config &mconfig, const char void bbc_beebsid_device::device_start() { - address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM); +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +READ8_MEMBER(bbc_beebsid_device::fred_r) +{ + uint8_t data = 0xff; - space.install_readwrite_handler(0xfc20, 0xfc3f, read8_delegate(FUNC(mos8580_device::read), (mos8580_device*)m_sid), write8_delegate(FUNC(mos8580_device::write), (mos8580_device*)m_sid)); + if (offset >= 0x20 && offset < 0x40) + { + data = m_sid->read(space, offset); + } + + data &= m_1mhzbus->fred_r(space, offset); + + return data; +} + +WRITE8_MEMBER(bbc_beebsid_device::fred_w) +{ + if (offset >= 0x20 && offset < 0x40) + { + m_sid->write(space, offset, data); + } + + m_1mhzbus->fred_w(space, offset, data); +} + +READ8_MEMBER(bbc_beebsid_device::jim_r) +{ + uint8_t data = 0xff; + + data &= m_1mhzbus->jim_r(space, offset); + + return data; +} + +WRITE8_MEMBER(bbc_beebsid_device::jim_w) +{ + m_1mhzbus->jim_w(space, offset, data); } diff --git a/src/devices/bus/bbc/1mhzbus/beebsid.h b/src/devices/bus/bbc/1mhzbus/beebsid.h index 30e20bf07d7..d78d5486c10 100644 --- a/src/devices/bus/bbc/1mhzbus/beebsid.h +++ b/src/devices/bus/bbc/1mhzbus/beebsid.h @@ -34,7 +34,13 @@ protected: // optional information overrides virtual void device_add_mconfig(machine_config &config) override; + virtual DECLARE_READ8_MEMBER(fred_r) override; + virtual DECLARE_WRITE8_MEMBER(fred_w) override; + virtual DECLARE_READ8_MEMBER(jim_r) override; + virtual DECLARE_WRITE8_MEMBER(jim_w) override; + private: + required_device<bbc_1mhzbus_slot_device> m_1mhzbus; required_device<mos8580_device> m_sid; }; diff --git a/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp b/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp index 63f2229b27a..0946d9cdf82 100644 --- a/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp +++ b/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp @@ -91,26 +91,20 @@ cfa3000_opt_device::cfa3000_opt_device(const machine_config &mconfig, const char void cfa3000_opt_device::device_start() { - address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM); - m_slot = dynamic_cast<bbc_1mhzbus_slot_device *>(owner()); - - space.install_read_handler(0xfcc2, 0xfcc2, read8_delegate(FUNC(cfa3000_opt_device::option_r), this)); } -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void cfa3000_opt_device::device_reset() -{ -} - //************************************************************************** // IMPLEMENTATION //************************************************************************** -READ8_MEMBER(cfa3000_opt_device::option_r) +READ8_MEMBER(cfa3000_opt_device::fred_r) { - return m_opt->read(); + uint8_t data = 0xff; + + if (offset == 0xc2) + { + data = m_opt->read(); + } + return data; } diff --git a/src/devices/bus/bbc/1mhzbus/cfa3000opt.h b/src/devices/bus/bbc/1mhzbus/cfa3000opt.h index e372a14b51b..5a4e413754b 100644 --- a/src/devices/bus/bbc/1mhzbus/cfa3000opt.h +++ b/src/devices/bus/bbc/1mhzbus/cfa3000opt.h @@ -28,16 +28,15 @@ public: // construction/destruction cfa3000_opt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - DECLARE_READ8_MEMBER(option_r); - protected: // device-level overrides virtual void device_start() override; - virtual void device_reset() override; // optional information overrides virtual ioport_constructor device_input_ports() const override; + virtual DECLARE_READ8_MEMBER(fred_r) override; + private: required_ioport m_opt; }; diff --git a/src/devices/bus/bbc/1mhzbus/opus3.cpp b/src/devices/bus/bbc/1mhzbus/opus3.cpp index ed204430bbe..0b39d5993ff 100644 --- a/src/devices/bus/bbc/1mhzbus/opus3.cpp +++ b/src/devices/bus/bbc/1mhzbus/opus3.cpp @@ -70,11 +70,11 @@ ROM_START( opus3 ) ROM_REGION(0x4000, "dfs_rom", 0) ROM_DEFAULT_BIOS("ch103") ROM_SYSTEM_BIOS(0, "ch100", "Challenger 1.00") - ROMX_LOAD("ch100.rom", 0x0000, 0x4000, CRC(740a8335) SHA1(f3c75c21bcd7d4a4dfff922fd287230dcdb91d0e), ROM_BIOS(0)) + ROMX_LOAD("chal100.rom", 0x0000, 0x4000, CRC(740a8335) SHA1(f3c75c21bcd7d4a4dfff922fd287230dcdb91d0e), ROM_BIOS(0)) ROM_SYSTEM_BIOS(1, "ch101", "Challenger 1.01") - ROMX_LOAD("ch101.rom", 0x0000, 0x4000, CRC(2f64503d) SHA1(37ee3f20bed50555720703b279f62aab0ed28922), ROM_BIOS(1)) + ROMX_LOAD("chal101.rom", 0x0000, 0x4000, CRC(2f64503d) SHA1(37ee3f20bed50555720703b279f62aab0ed28922), ROM_BIOS(1)) ROM_SYSTEM_BIOS(2, "ch103", "Challenger 1.03") - ROMX_LOAD("ch103.rom", 0x0000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33), ROM_BIOS(2)) + ROMX_LOAD("chal103.rom", 0x0000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33), ROM_BIOS(2)) ROM_END //------------------------------------------------- @@ -86,8 +86,9 @@ void bbc_opus3_device::device_add_mconfig(machine_config &config) /* fdc */ WD1770(config, m_fdc, 16_MHz_XTAL / 2); m_fdc->drq_wr_callback().set(FUNC(bbc_opus3_device::fdc_drq_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies, "525qd", floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies, "525qd", floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies, nullptr, floppy_formats).enable_sound(true); /* ram disk */ RAM(config, m_ramdisk).set_default_size("512K").set_extra_options("256K").set_default_value(0); @@ -113,7 +114,8 @@ bbc_opus3_device::bbc_opus3_device(const machine_config &mconfig, const char *ta m_ramdisk(*this, "ramdisk"), m_fdc(*this, "wd1770"), m_floppy0(*this, "wd1770:0"), - m_floppy1(*this, "wd1770:1") + m_floppy1(*this, "wd1770:1"), + m_ramdisk_page(0) { } @@ -123,13 +125,6 @@ bbc_opus3_device::bbc_opus3_device(const machine_config &mconfig, const char *ta void bbc_opus3_device::device_start() { - address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM); - m_slot = dynamic_cast<bbc_1mhzbus_slot_device *>(owner()); - - space.install_readwrite_handler(0xfcf8, 0xfcfb, read8sm_delegate(FUNC(wd1770_device::read), m_fdc.target()), write8sm_delegate(FUNC(wd1770_device::write), m_fdc.target())); - space.install_write_handler(0xfcfc, 0xfcfc, WRITE8_DELEGATE(bbc_opus3_device, wd1770l_write)); - space.install_write_handler(0xfcfe, 0xfcff, WRITE8_DELEGATE(bbc_opus3_device, page_w)); - space.install_readwrite_handler(0xfd00, 0xfdff, READ8_DELEGATE(bbc_opus3_device, ramdisk_r), WRITE8_DELEGATE(bbc_opus3_device, ramdisk_w)); } //------------------------------------------------- @@ -146,24 +141,57 @@ void bbc_opus3_device::device_reset() // IMPLEMENTATION //************************************************************************** -WRITE8_MEMBER(bbc_opus3_device::wd1770l_write) +READ8_MEMBER(bbc_opus3_device::fred_r) { - floppy_image_device *floppy = nullptr; + uint8_t data = 0xff; - // bit 1, 2: drive select - if (BIT(data, 1)) floppy = m_floppy0->get_device(); - if (BIT(data, 2)) floppy = m_floppy1->get_device(); - m_fdc->set_floppy(floppy); - - // bit 0: side select - if (floppy) - floppy->ss_w(BIT(data, 0)); + switch (offset) + { + case 0xf8: + case 0xf9: + case 0xfa: + case 0xfb: + data = m_fdc->read(offset & 0x03); + break; + } + return data; +} - // bit 4: interrupt enabled - m_fdc_ie = BIT(data, 4); +WRITE8_MEMBER(bbc_opus3_device::fred_w) +{ + floppy_image_device *floppy = nullptr; - // bit 5: density - m_fdc->dden_w(BIT(data, 5)); + switch (offset) + { + case 0xf8: + case 0xf9: + case 0xfa: + case 0xfb: + m_fdc->write(offset & 0x03, data); + break; + case 0xfc: + // bit 1, 2: drive select + if (BIT(data, 1)) floppy = m_floppy0->get_device(); + if (BIT(data, 2)) floppy = m_floppy1->get_device(); + m_fdc->set_floppy(floppy); + + // bit 0: side select + if (floppy) + floppy->ss_w(BIT(data, 0)); + + // bit 4: interrupt enabled + m_fdc_ie = BIT(data, 4); + + // bit 5: density + m_fdc->dden_w(BIT(data, 5)); + break; + case 0xfe: + m_ramdisk_page = (m_ramdisk_page & 0x00ff) | (data << 8); + break; + case 0xff: + m_ramdisk_page = (m_ramdisk_page & 0xff00) | (data << 0); + break; + } } WRITE_LINE_MEMBER(bbc_opus3_device::fdc_drq_w) @@ -173,16 +201,7 @@ WRITE_LINE_MEMBER(bbc_opus3_device::fdc_drq_w) m_slot->nmi_w((m_fdc_drq && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE); } -WRITE8_MEMBER(bbc_opus3_device::page_w) -{ - switch (offset) - { - case 0x00: m_ramdisk_page = (m_ramdisk_page & 0x00ff) | (data << 8); break; - case 0x01: m_ramdisk_page = (m_ramdisk_page & 0xff00) | (data << 0); break; - } -} - -READ8_MEMBER(bbc_opus3_device::ramdisk_r) +READ8_MEMBER(bbc_opus3_device::jim_r) { if ((m_ramdisk_page << 8) < m_ramdisk->size()) return m_ramdisk->read((m_ramdisk_page << 8) + offset); @@ -190,7 +209,7 @@ READ8_MEMBER(bbc_opus3_device::ramdisk_r) return 0xff; } -WRITE8_MEMBER(bbc_opus3_device::ramdisk_w) +WRITE8_MEMBER(bbc_opus3_device::jim_w) { if ((m_ramdisk_page << 8) < m_ramdisk->size()) m_ramdisk->write((m_ramdisk_page << 8) + offset, data); diff --git a/src/devices/bus/bbc/1mhzbus/opus3.h b/src/devices/bus/bbc/1mhzbus/opus3.h index 826906a584f..1e3e1a4065d 100644 --- a/src/devices/bus/bbc/1mhzbus/opus3.h +++ b/src/devices/bus/bbc/1mhzbus/opus3.h @@ -28,11 +28,6 @@ public: // construction/destruction bbc_opus3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - DECLARE_WRITE8_MEMBER(wd1770l_write); - DECLARE_WRITE8_MEMBER(page_w); - DECLARE_READ8_MEMBER(ramdisk_r); - DECLARE_WRITE8_MEMBER(ramdisk_w); - protected: // device-level overrides virtual void device_start() override; @@ -42,6 +37,11 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; + virtual DECLARE_READ8_MEMBER(fred_r) override; + virtual DECLARE_WRITE8_MEMBER(fred_w) override; + virtual DECLARE_READ8_MEMBER(jim_r) override; + virtual DECLARE_WRITE8_MEMBER(jim_w) override; + private: DECLARE_FLOPPY_FORMATS(floppy_formats); diff --git a/src/devices/bus/bbc/analogue/analogue.cpp b/src/devices/bus/bbc/analogue/analogue.cpp index 226bc69bf0f..facc1a827bc 100644 --- a/src/devices/bus/bbc/analogue/analogue.cpp +++ b/src/devices/bus/bbc/analogue/analogue.cpp @@ -33,15 +33,6 @@ device_bbc_analogue_interface::device_bbc_analogue_interface(const machine_confi } -//------------------------------------------------- -// ~device_bbc_analogue_interface - destructor -//------------------------------------------------- - -device_bbc_analogue_interface::~device_bbc_analogue_interface() -{ -} - - //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -52,7 +43,9 @@ device_bbc_analogue_interface::~device_bbc_analogue_interface() bbc_analogue_slot_device::bbc_analogue_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, BBC_ANALOGUE_SLOT, tag, owner, clock), - device_slot_interface(mconfig, *this) + device_slot_interface(mconfig, *this), + m_card(nullptr), + m_lpstb_handler(*this) { } @@ -71,8 +64,12 @@ void bbc_analogue_slot_device::device_validity_check(validity_checker &valid) co void bbc_analogue_slot_device::device_start() { device_t *const carddev = get_card_device(); - if (carddev && !dynamic_cast<device_bbc_analogue_interface *>(carddev)) + m_card = dynamic_cast<device_bbc_analogue_interface *>(get_card_device()); + if (carddev && !m_card) osd_printf_error("Card device %s (%s) does not implement device_bbc_analogue_interface\n", carddev->tag(), carddev->name()); + + // resolve callbacks + m_lpstb_handler.resolve_safe(); } uint8_t bbc_analogue_slot_device::ch_r(int channel) @@ -107,6 +104,9 @@ void bbc_analogue_slot_device::device_reset() // slot devices #include "joystick.h" +#include "bitstik.h" +//#include "lightpen.h" +//#include "micromike.h" //#include "quinkey.h" #include "cfa3000a.h" @@ -114,7 +114,11 @@ void bbc_analogue_slot_device::device_reset() void bbc_analogue_devices(device_slot_interface &device) { device.option_add("acornjoy", BBC_ACORNJOY); /* Acorn ANH01 Joysticks */ + device.option_add("bitstik1", BBC_BITSTIK1); /* Acorn ANF04 Bitstik */ + device.option_add("bitstik2", BBC_BITSTIK2); /* Robocom Bitstik 2 */ + //device.option_add("lightpen", BBC_LIGHTPEN); /* RH Electronics Lightpen */ + //device.option_add("micromike", BBC_MICROMIKE); /* Micro Mike */ device.option_add("voltmace3b", BBC_VOLTMACE3B); /* Voltmace Delta 3b "Twin" Joysticks */ -// device.option_add("quinkey", BBC_QUINKEY); /* Microwriter Quinkey */ + //device.option_add("quinkey", BBC_QUINKEY); /* Microwriter Quinkey */ device.option_add("cfa3000a", CFA3000_ANLG); /* Hanson CFA 3000 Analogue */ } diff --git a/src/devices/bus/bbc/analogue/analogue.h b/src/devices/bus/bbc/analogue/analogue.h index 6e9cc8a9eae..d8aec89e012 100644 --- a/src/devices/bus/bbc/analogue/analogue.h +++ b/src/devices/bus/bbc/analogue/analogue.h @@ -34,21 +34,6 @@ //************************************************************************** -// CONSTANTS -//************************************************************************** - -#define BBC_ANALOGUE_SLOT_TAG "analogue" - - -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_BBC_ANALOGUE_SLOT_ADD(_tag, _slot_intf, _def_slot) \ - MCFG_DEVICE_ADD(_tag, BBC_ANALOGUE_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -60,7 +45,22 @@ class bbc_analogue_slot_device : public device_t, public device_slot_interface { public: // construction/destruction - bbc_analogue_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + template <typename T> + bbc_analogue_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option) + : bbc_analogue_slot_device(mconfig, tag, owner) + { + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(false); + } + + bbc_analogue_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); + + // callbacks + auto lpstb_handler() { return m_lpstb_handler.bind(); } + + DECLARE_WRITE_LINE_MEMBER(lpstb_w) { m_lpstb_handler(state); } uint8_t ch_r(int channel); uint8_t pb_r(); @@ -72,6 +72,9 @@ protected: virtual void device_reset() override; device_bbc_analogue_interface *m_card; + +private: + devcb_write_line m_lpstb_handler; }; @@ -80,9 +83,6 @@ protected: class device_bbc_analogue_interface : public device_slot_card_interface { public: - // construction/destruction - virtual ~device_bbc_analogue_interface(); - virtual uint8_t ch_r(int channel) { return 0x00; }; virtual uint8_t pb_r() { return 0x30; }; diff --git a/src/devices/bus/bbc/analogue/bitstik.cpp b/src/devices/bus/bbc/analogue/bitstik.cpp new file mode 100644 index 00000000000..42d8fff9504 --- /dev/null +++ b/src/devices/bus/bbc/analogue/bitstik.cpp @@ -0,0 +1,143 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Acorn ANF04 Bitstik + + http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_BitStik.html + + Robocom Bitstik 2 + +**********************************************************************/ + +#include "emu.h" +#include "bitstik.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(BBC_BITSTIK1, bbc_bitstik1_device, "bbc_bitstik1", "Acorn Bitstik") +DEFINE_DEVICE_TYPE(BBC_BITSTIK2, bbc_bitstik2_device, "bbc_bitstik2", "Robo Bitstik 2") + +//------------------------------------------------- +// ROM( bitstik ) +//------------------------------------------------- + +ROM_START(bitstik1) + ROM_REGION(0x4000, "rom", 0) + ROM_LOAD("bitstik1.rom", 0x0000, 0x2000, CRC(a3c539f8) SHA1(c6f2cf2f6d1e48819a8381c6a1c97ca8fa5ab117)) + ROM_RELOAD(0x2000, 0x2000) +ROM_END + +ROM_START(bitstik2) + ROM_REGION(0x4000, "rom", 0) + ROM_LOAD("bitstik2.rom", 0x0000, 0x2000, CRC(a2b5a743) SHA1(4d0040af6bdc6a587e42d4aa36d528b768cf9549)) + ROM_RELOAD(0x2000, 0x2000) +ROM_END + +//------------------------------------------------- +// INPUT_PORTS( bitstik ) +//------------------------------------------------- + +static INPUT_PORTS_START(bitstik) + PORT_START("CHANNEL0") + PORT_BIT(0xff, 0x00, IPT_AD_STICK_X) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_NAME("AD Stick X") PORT_REVERSE + + PORT_START("CHANNEL1") + PORT_BIT(0xff, 0x00, IPT_AD_STICK_Y) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_NAME("AD Stick Y") PORT_REVERSE + + PORT_START("CHANNEL2") + PORT_BIT(0xff, 0x00, IPT_AD_STICK_Z) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_NAME("AD Stick Z") PORT_REVERSE + + PORT_START("CHANNEL3") + PORT_BIT(0xff, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Right Button - Release") + + PORT_START("BUTTONS") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Top Button - Execute") + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("Left Button - Confirm") +INPUT_PORTS_END + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor bbc_bitstik_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(bitstik); +} + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const tiny_rom_entry *bbc_bitstik1_device::device_rom_region() const +{ + return ROM_NAME(bitstik1); +} + +const tiny_rom_entry *bbc_bitstik2_device::device_rom_region() const +{ + return ROM_NAME(bitstik2); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bbc_bitstik_device - constructor +//------------------------------------------------- + +bbc_bitstik_device::bbc_bitstik_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, type, tag, owner, clock), + device_bbc_analogue_interface(mconfig, *this), + m_channel(*this, "CHANNEL%u", 0), + m_buttons(*this, "BUTTONS"), + m_rom(*this, "rom") +{ +} + +bbc_bitstik1_device::bbc_bitstik1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + bbc_bitstik_device(mconfig, BBC_BITSTIK1, tag, owner, clock) +{ +} + +bbc_bitstik2_device::bbc_bitstik2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + bbc_bitstik_device(mconfig, BBC_BITSTIK2, tag, owner, clock) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bbc_bitstik_device::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void bbc_bitstik_device::device_reset() +{ + machine().root_device().membank("bank4")->configure_entry(13, memregion("rom")->base()); +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +uint8_t bbc_bitstik_device::ch_r(int channel) +{ + return m_channel[channel]->read(); +} + +uint8_t bbc_bitstik_device::pb_r() +{ + return m_buttons->read() & 0x30; +} diff --git a/src/devices/bus/bbc/analogue/bitstik.h b/src/devices/bus/bbc/analogue/bitstik.h new file mode 100644 index 00000000000..3319bfe0c2e --- /dev/null +++ b/src/devices/bus/bbc/analogue/bitstik.h @@ -0,0 +1,75 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Acorn ANF04 Bitstik + + http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_BitStik.html + + Robocom Bitstik 2 + +**********************************************************************/ + + +#ifndef MAME_BUS_BBC_ANALOGUE_BITSTIK_H +#define MAME_BUS_BBC_ANALOGUE_BITSTIK_H + +#pragma once + + +#include "analogue.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> bbc_bitstik_device + +class bbc_bitstik_device : + public device_t, + public device_bbc_analogue_interface +{ +protected: + // construction/destruction + bbc_bitstik_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + + virtual uint8_t ch_r(int channel) override; + virtual uint8_t pb_r() override; + +private: + required_ioport_array<4> m_channel; + required_ioport m_buttons; + required_memory_region m_rom; +}; + +class bbc_bitstik1_device : public bbc_bitstik_device +{ +public: + bbc_bitstik1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual const tiny_rom_entry *device_rom_region() const override; +}; + +class bbc_bitstik2_device : public bbc_bitstik_device +{ +public: + bbc_bitstik2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual const tiny_rom_entry *device_rom_region() const override; +}; + +// device type definition +DECLARE_DEVICE_TYPE(BBC_BITSTIK1, bbc_bitstik1_device) +DECLARE_DEVICE_TYPE(BBC_BITSTIK2, bbc_bitstik2_device) + + +#endif // MAME_BUS_BBC_ANALOGUE_BITSTIK_H diff --git a/src/devices/bus/bbc/analogue/cfa3000a.cpp b/src/devices/bus/bbc/analogue/cfa3000a.cpp index da163200c2c..0dfd692df12 100644 --- a/src/devices/bus/bbc/analogue/cfa3000a.cpp +++ b/src/devices/bus/bbc/analogue/cfa3000a.cpp @@ -96,5 +96,5 @@ uint8_t cfa3000_anlg_device::ch_r(int channel) uint8_t cfa3000_anlg_device::pb_r() { - return m_buttons->read(); + return m_buttons->read() & 0x30; } diff --git a/src/devices/bus/bbc/analogue/joystick.cpp b/src/devices/bus/bbc/analogue/joystick.cpp index e67abff9e22..a6e37ebb3ba 100644 --- a/src/devices/bus/bbc/analogue/joystick.cpp +++ b/src/devices/bus/bbc/analogue/joystick.cpp @@ -130,5 +130,5 @@ uint8_t bbc_joystick_device::ch_r(int channel) uint8_t bbc_joystick_device::pb_r() { - return m_buttons->read(); + return m_buttons->read() & 0x30; } diff --git a/src/devices/bus/bbc/fdc/acorn.cpp b/src/devices/bus/bbc/fdc/acorn.cpp index 21d4f710637..e2ae28fdf0c 100644 --- a/src/devices/bus/bbc/fdc/acorn.cpp +++ b/src/devices/bus/bbc/fdc/acorn.cpp @@ -100,15 +100,15 @@ ROM_START( acorn1770 ) ROM_DEFAULT_BIOS("dfs223") // Acorn ROM_SYSTEM_BIOS(0, "dfs210", "Acorn DFS 2.10") - ROMX_LOAD("dfs v2.10,1985,acorn.bin", 0x0000, 0x4000, CRC(4f828787) SHA1(112a315e1598cb4db2abcfe9d89fcd97444b276d), ROM_BIOS(0)) + ROMX_LOAD("dfs v2.10,acorn.rom", 0x0000, 0x4000, CRC(4f828787) SHA1(112a315e1598cb4db2abcfe9d89fcd97444b276d), ROM_BIOS(0)) ROM_SYSTEM_BIOS(1, "dfs220", "Acorn DFS 2.20") - ROMX_LOAD("dfs v2.20,1986,acorn.bin", 0x0000, 0x4000, CRC(2844001e) SHA1(d72f11af35756ac648095ba1992211cf6741dd80), ROM_BIOS(1)) + ROMX_LOAD("dfs v2.20,acorn.rom", 0x0000, 0x4000, CRC(2844001e) SHA1(d72f11af35756ac648095ba1992211cf6741dd80), ROM_BIOS(1)) ROM_SYSTEM_BIOS(2, "dfs223", "Acorn DFS 2.23") - ROMX_LOAD("dfs v2.23,1986,acorn.bin", 0x0000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa), ROM_BIOS(2)) + ROMX_LOAD("dfs v2.23,acorn.rom", 0x0000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa), ROM_BIOS(2)) ROM_SYSTEM_BIOS(3, "dfs225", "Acorn DFS 2.25") - ROMX_LOAD("dfs v2.25,1986,acorn.bin", 0x0000, 0x4000, CRC(f855a75b) SHA1(f11271748e6303c60182955e5fa478624b616fcf), ROM_BIOS(3)) + ROMX_LOAD("dfs v2.25,acorn.rom", 0x0000, 0x4000, CRC(f855a75b) SHA1(f11271748e6303c60182955e5fa478624b616fcf), ROM_BIOS(3)) ROM_SYSTEM_BIOS(4, "dfs226", "Acorn DFS 2.26") - ROMX_LOAD("dfs v2.26,1986,acorn.bin", 0x0000, 0x4000, CRC(5ae33e94) SHA1(cf2ebc422a8d24ec6f1a0320520c38a0e704109a), ROM_BIOS(4)) + ROMX_LOAD("dfs v2.26,acorn.rom", 0x0000, 0x4000, CRC(5ae33e94) SHA1(cf2ebc422a8d24ec6f1a0320520c38a0e704109a), ROM_BIOS(4)) // Advanced Computer Products ROM_SYSTEM_BIOS(5, "acp108", "Advanced 1770 DFS 1.08") ROMX_LOAD("advanced 1770 dfs 1.08,acp.rom", 0x0000, 0x4000, CRC(eb0eaa34) SHA1(d16ba3c8ed5e5ab6af62aad13a8e567b1c3639c2), ROM_BIOS(5)) @@ -121,21 +121,23 @@ ROM_END // device_add_mconfig - add device configuration //------------------------------------------------- -void bbc_acorn8271_device::device_add_mconfig(machine_config & config) +void bbc_acorn8271_device::device_add_mconfig(machine_config &config) { - I8271(config, m_fdc, 0); + I8271(config, m_fdc, 16_MHz_XTAL / 8); m_fdc->intrq_wr_callback().set(FUNC(bbc_acorn8271_device::fdc_intrq_w)); m_fdc->hdl_wr_callback().set(FUNC(bbc_acorn8271_device::motor_w)); m_fdc->opt_wr_callback().set(FUNC(bbc_acorn8271_device::side_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true); } -void bbc_acorn1770_device::device_add_mconfig(machine_config & config) +void bbc_acorn1770_device::device_add_mconfig(machine_config &config) { - WD1770(config, m_fdc, XTAL(16'000'000) / 2); + WD1770(config, m_fdc, 16_MHz_XTAL / 2); m_fdc->intrq_wr_callback().set(FUNC(bbc_acorn1770_device::fdc_intrq_w)); m_fdc->drq_wr_callback().set(FUNC(bbc_acorn1770_device::fdc_drq_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true); } @@ -160,22 +162,23 @@ const tiny_rom_entry *bbc_acorn1770_device::device_rom_region() const //------------------------------------------------- bbc_acorn8271_device::bbc_acorn8271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, BBC_ACORN8271, tag, owner, clock), - device_bbc_fdc_interface(mconfig, *this), - m_dfs_rom(*this, "dfs_rom"), - m_fdc(*this, "i8271"), - m_floppy0(*this, "i8271:0"), - m_floppy1(*this, "i8271:1") + : device_t(mconfig, BBC_ACORN8271, tag, owner, clock) + , device_bbc_fdc_interface(mconfig, *this) + , m_dfs_rom(*this, "dfs_rom") + , m_fdc(*this, "i8271") + , m_floppy0(*this, "i8271:0") + , m_floppy1(*this, "i8271:1") { } bbc_acorn1770_device::bbc_acorn1770_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, BBC_ACORN1770, tag, owner, clock), - device_bbc_fdc_interface(mconfig, *this), - m_dfs_rom(*this, "dfs_rom"), - m_fdc(*this, "wd1770"), - m_floppy0(*this, "wd1770:0"), - m_floppy1(*this, "wd1770:1") + : device_t(mconfig, BBC_ACORN1770, tag, owner, clock) + , device_bbc_fdc_interface(mconfig, *this) + , m_dfs_rom(*this, "dfs_rom") + , m_fdc(*this, "wd1770") + , m_floppy0(*this, "wd1770:0") + , m_floppy1(*this, "wd1770:1") + , m_drive_control(0) { } @@ -186,24 +189,11 @@ bbc_acorn1770_device::bbc_acorn1770_device(const machine_config &mconfig, const void bbc_acorn8271_device::device_start() { - device_t* cpu = machine().device("maincpu"); - address_space& space = cpu->memory().space(AS_PROGRAM); - m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner()); - - space.install_device(0xfe80, 0xfe83, *m_fdc, &i8271_device::map); - space.install_readwrite_handler(0xfe84, 0xfe9f, READ8_DEVICE_DELEGATE(m_fdc, i8271_device, data_r), WRITE8_DEVICE_DELEGATE(m_fdc, i8271_device, data_w)); } void bbc_acorn1770_device::device_start() { - device_t* cpu = machine().device("maincpu"); - address_space& space = cpu->memory().space(AS_PROGRAM); - m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner()); - - space.install_readwrite_handler(0xfe80, 0xfe83, READ8_DELEGATE(bbc_acorn1770_device, wd1770l_read), WRITE8_DELEGATE(bbc_acorn1770_device, wd1770l_write)); - space.install_readwrite_handler(0xfe84, 0xfe9f, read8sm_delegate(FUNC(wd1770_device::read), m_fdc.target()), write8sm_delegate(FUNC(wd1770_device::write), m_fdc.target())); - - m_drive_control = 0xfe; + save_item(NAME(m_drive_control)); } //------------------------------------------------- @@ -213,13 +203,13 @@ void bbc_acorn1770_device::device_start() void bbc_acorn8271_device::device_reset() { machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base()); - - m_fdc->soft_reset(); } void bbc_acorn1770_device::device_reset() { machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base()); + + m_drive_control = 0xfe; } @@ -227,10 +217,38 @@ void bbc_acorn1770_device::device_reset() // IMPLEMENTATION //************************************************************************** +READ8_MEMBER(bbc_acorn8271_device::read) +{ + uint8_t data; + + if (offset & 0x04) + { + data = m_fdc->data_r(space , 0); + } + else + { + data = m_fdc->read(space, offset & 0x03); + } + return data; +} + +WRITE8_MEMBER(bbc_acorn8271_device::write) +{ + if (offset & 0x04) + { + m_fdc->data_w(space, 0, data); + } + else + { + m_fdc->write(space, offset & 0x03, data); + } +} + WRITE_LINE_MEMBER(bbc_acorn8271_device::motor_w) { if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state); if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state); + m_fdc->ready_w(!state); } WRITE_LINE_MEMBER(bbc_acorn8271_device::side_w) @@ -245,39 +263,59 @@ WRITE_LINE_MEMBER(bbc_acorn8271_device::fdc_intrq_w) } -READ8_MEMBER(bbc_acorn1770_device::wd1770l_read) +READ8_MEMBER(bbc_acorn1770_device::read) { - return m_drive_control; + uint8_t data = 0xff; + + if (offset & 0x04) + { + data = m_fdc->read(offset & 0x03); + } + else + { + data = m_drive_control; + } + return data; } -WRITE8_MEMBER(bbc_acorn1770_device::wd1770l_write) +WRITE8_MEMBER(bbc_acorn1770_device::write) { - floppy_image_device *floppy = nullptr; - - m_drive_control = data; - - // bit 0, 1: drive select - if (BIT(data, 0)) floppy = m_floppy0->get_device(); - if (BIT(data, 1)) floppy = m_floppy1->get_device(); - m_fdc->set_floppy(floppy); - - // bit 2: side select - if (floppy) - floppy->ss_w(BIT(data, 2)); - - // bit 3: density - m_fdc->dden_w(BIT(data, 3)); - - // bit 5: reset - if (!BIT(data, 5)) m_fdc->soft_reset(); + if (offset & 0x04) + { + m_fdc->write(offset & 0x03, data); + } + else + { + floppy_image_device *floppy = nullptr; + + m_drive_control = data; + + // bit 0, 1: drive select + if (BIT(data, 0)) floppy = m_floppy0->get_device(); + if (BIT(data, 1)) floppy = m_floppy1->get_device(); + m_fdc->set_floppy(floppy); + + // bit 2: side select + if (floppy) + floppy->ss_w(BIT(data, 2)); + + // bit 3: density + m_fdc->dden_w(BIT(data, 3)); + + // bit 4: interrupt enabled + m_fdc_ie = !BIT(data, 4); + + // bit 5: reset + if (!BIT(data, 5)) m_fdc->soft_reset(); + } } WRITE_LINE_MEMBER(bbc_acorn1770_device::fdc_intrq_w) { - m_slot->intrq_w(state); + m_slot->intrq_w((state && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE); } WRITE_LINE_MEMBER(bbc_acorn1770_device::fdc_drq_w) { - m_slot->drq_w(state); + m_slot->drq_w((state && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE); } diff --git a/src/devices/bus/bbc/fdc/acorn.h b/src/devices/bus/bbc/fdc/acorn.h index 85323e1fb6a..4e2993f1016 100644 --- a/src/devices/bus/bbc/fdc/acorn.h +++ b/src/devices/bus/bbc/fdc/acorn.h @@ -25,7 +25,6 @@ class bbc_acorn8271_device : public device_t, public device_bbc_fdc_interface - { public: // construction/destruction @@ -42,6 +41,9 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; + virtual DECLARE_READ8_MEMBER(read) override; + virtual DECLARE_WRITE8_MEMBER(write) override; + private: DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); DECLARE_WRITE_LINE_MEMBER(motor_w); @@ -56,7 +58,6 @@ private: class bbc_acorn1770_device : public device_t, public device_bbc_fdc_interface - { public: // construction/destruction @@ -71,9 +72,10 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; + virtual DECLARE_READ8_MEMBER(read) override; + virtual DECLARE_WRITE8_MEMBER(write) override; + private: - DECLARE_READ8_MEMBER(wd1770l_read); - DECLARE_WRITE8_MEMBER(wd1770l_write); DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); @@ -83,6 +85,7 @@ private: optional_device<floppy_connector> m_floppy1; int m_drive_control; + int m_fdc_ie; }; diff --git a/src/devices/bus/bbc/fdc/ams.cpp b/src/devices/bus/bbc/fdc/ams.cpp new file mode 100644 index 00000000000..2afc7c969a2 --- /dev/null +++ b/src/devices/bus/bbc/fdc/ams.cpp @@ -0,0 +1,146 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + AMS 3" Microdrive Disc System + +**********************************************************************/ + + +#include "emu.h" +#include "ams.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(BBC_AMS3, bbc_ams3_device, "bbc_ams3", "AMS 3" Microdrive Disc System") + + +//------------------------------------------------- +// MACHINE_DRIVER( ams3 ) +//------------------------------------------------- + +FLOPPY_FORMATS_MEMBER( bbc_ams3_device::floppy_formats ) + FLOPPY_ACORN_SSD_FORMAT +FLOPPY_FORMATS_END + +ROM_START( ams3 ) + ROM_REGION(0x8000, "dfs_rom", 0) + ROM_LOAD("dfs098.rom", 0x0000, 0x2000, CRC(90852e7d) SHA1(6df3552d5426f3a4625b9a0c7829bdba03f05e84)) + ROM_RELOAD( 0x2000, 0x2000) + ROM_LOAD("amsdisc.rom", 0x4000, 0x1000, CRC(93876595) SHA1(a9d9123667e65334b28b8588b09642478653e356)) + ROM_RELOAD( 0x5000, 0x1000) + ROM_RELOAD( 0x6000, 0x1000) + ROM_RELOAD( 0x7000, 0x1000) +ROM_END + + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void bbc_ams3_device::device_add_mconfig(machine_config &config) +{ + I8271(config, m_fdc, 16_MHz_XTAL / 8); + m_fdc->intrq_wr_callback().set(FUNC(bbc_ams3_device::fdc_intrq_w)); + m_fdc->hdl_wr_callback().set(FUNC(bbc_ams3_device::motor_w)); + m_fdc->opt_wr_callback().set(FUNC(bbc_ams3_device::side_w)); + // Hitachi HFD 305S + FLOPPY_CONNECTOR(config, m_floppy0, "3dsdd", FLOPPY_3_DSDD, true, bbc_ams3_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy1, "3dsdd", FLOPPY_3_DSDD, false, bbc_ams3_device::floppy_formats).enable_sound(true); +} + + +const tiny_rom_entry *bbc_ams3_device::device_rom_region() const +{ + return ROM_NAME( ams3 ); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bbc_ams3_device - constructor +//------------------------------------------------- + +bbc_ams3_device::bbc_ams3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, BBC_AMS3, tag, owner, clock) + , device_bbc_fdc_interface(mconfig, *this) + , m_dfs_rom(*this, "dfs_rom") + , m_fdc(*this, "i8271") + , m_floppy0(*this, "i8271:0") + , m_floppy1(*this, "i8271:1") +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bbc_ams3_device::device_start() +{ +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void bbc_ams3_device::device_reset() +{ + machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base() + 0x0000); + machine().root_device().membank("bank4")->configure_entry(13, memregion("dfs_rom")->base() + 0x4000); +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +READ8_MEMBER(bbc_ams3_device::read) +{ + uint8_t data; + + if (offset & 0x04) + { + data = m_fdc->data_r(space , 0); + } + else + { + data = m_fdc->read(space, offset & 0x03); + } + return data; +} + +WRITE8_MEMBER(bbc_ams3_device::write) +{ + if (offset & 0x04) + { + m_fdc->data_w(space, 0, data); + } + else + { + m_fdc->write(space, offset & 0x03, data); + } +} + +WRITE_LINE_MEMBER(bbc_ams3_device::motor_w) +{ + if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state); + if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state); + m_fdc->ready_w(!state); +} + +WRITE_LINE_MEMBER(bbc_ams3_device::side_w) +{ + if (m_floppy0->get_device()) m_floppy0->get_device()->ss_w(state); + if (m_floppy1->get_device()) m_floppy1->get_device()->ss_w(state); +} + +WRITE_LINE_MEMBER(bbc_ams3_device::fdc_intrq_w) +{ + m_slot->intrq_w(state); +} diff --git a/src/devices/bus/bbc/fdc/ams.h b/src/devices/bus/bbc/fdc/ams.h new file mode 100644 index 00000000000..acdb077b3f6 --- /dev/null +++ b/src/devices/bus/bbc/fdc/ams.h @@ -0,0 +1,61 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + AMS 3" Microdrive Disc System + +**********************************************************************/ + + +#ifndef MAME_BUS_BBC_FDC_AMS_H +#define MAME_BUS_BBC_FDC_AMS_H + +#pragma once + +#include "fdc.h" +#include "machine/i8271.h" +#include "formats/acorn_dsk.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class bbc_ams3_device : + public device_t, + public device_bbc_fdc_interface +{ +public: + // construction/destruction + bbc_ams3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + DECLARE_FLOPPY_FORMATS(floppy_formats); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual DECLARE_READ8_MEMBER(read) override; + virtual DECLARE_WRITE8_MEMBER(write) override; + +private: + DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); + DECLARE_WRITE_LINE_MEMBER(motor_w); + DECLARE_WRITE_LINE_MEMBER(side_w); + + required_memory_region m_dfs_rom; + required_device<i8271_device> m_fdc; + required_device<floppy_connector> m_floppy0; + optional_device<floppy_connector> m_floppy1; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(BBC_AMS3, bbc_ams3_device) + + +#endif // MAME_BUS_BBC_FDC_AMS_H diff --git a/src/devices/bus/bbc/fdc/cumana.cpp b/src/devices/bus/bbc/fdc/cumana.cpp index 5639fef1976..4de4c9df704 100644 --- a/src/devices/bus/bbc/fdc/cumana.cpp +++ b/src/devices/bus/bbc/fdc/cumana.cpp @@ -65,6 +65,7 @@ void bbc_cumana1_device::device_add_mconfig(machine_config &config) m_fdc->intrq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_intrq_w)); m_fdc->drq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_drq_w)); m_fdc->hld_wr_callback().set(FUNC(bbc_cumanafdc_device::motor_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); } @@ -75,6 +76,7 @@ void bbc_cumana2_device::device_add_mconfig(machine_config &config) m_fdc->intrq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_intrq_w)); m_fdc->drq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_drq_w)); m_fdc->hld_wr_callback().set(FUNC(bbc_cumanafdc_device::motor_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); } @@ -104,7 +106,8 @@ bbc_cumanafdc_device::bbc_cumanafdc_device(const machine_config &mconfig, device m_fdc(*this, "mb8877a"), m_floppy0(*this, "mb8877a:0"), m_floppy1(*this, "mb8877a:1"), - m_dfs_rom(*this, "dfs_rom") + m_dfs_rom(*this, "dfs_rom"), + m_drive_control(0) { } @@ -127,12 +130,7 @@ bbc_cumana2_device::bbc_cumana2_device(const machine_config &mconfig, const char void bbc_cumanafdc_device::device_start() { - device_t* cpu = machine().device("maincpu"); - address_space& space = cpu->memory().space(AS_PROGRAM); - m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner()); - - space.install_readwrite_handler(0xfe80, 0xfe83, READ8_DELEGATE(bbc_cumanafdc_device, ctrl_r), WRITE8_DELEGATE(bbc_cumanafdc_device, ctrl_w)); - space.install_readwrite_handler(0xfe84, 0xfe9f, read8sm_delegate(FUNC(mb8877_device::read), m_fdc.target()), write8sm_delegate(FUNC(mb8877_device::write), m_fdc.target())); + save_item(NAME(m_drive_control)); } //------------------------------------------------- @@ -142,8 +140,6 @@ void bbc_cumanafdc_device::device_start() void bbc_cumanafdc_device::device_reset() { machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base()); - - m_fdc->soft_reset(); } @@ -151,47 +147,66 @@ void bbc_cumanafdc_device::device_reset() // IMPLEMENTATION //************************************************************************** -READ8_MEMBER(bbc_cumanafdc_device::ctrl_r) +READ8_MEMBER(bbc_cumanafdc_device::read) { - return m_drive_control; + uint8_t data; + + if (offset & 0x04) + { + data = m_fdc->read(offset & 0x03); + } + else + { + data = m_drive_control; + } + return data; } -WRITE8_MEMBER(bbc_cumanafdc_device::ctrl_w) +WRITE8_MEMBER(bbc_cumanafdc_device::write) { - floppy_image_device *floppy = nullptr; - - m_drive_control = data; - - // bit 0: drive select - floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device(); - floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device(); - floppy = (BIT(data, 0) ? floppy1 : floppy0); - m_fdc->set_floppy(floppy); - - // Not sure why QFS 1.02 inverts these two bits, need to see an original board to verify - if (m_invert) + if (offset & 0x04) { - // bit 1: side select - if (floppy) - floppy->ss_w(!BIT(data, 1)); - - // bit 2: density - m_fdc->dden_w(!BIT(data, 2)); + m_fdc->write(offset & 0x03, data); } else { - // bit 1: side select - if (floppy) - floppy->ss_w(BIT(data, 1)); + floppy_image_device *floppy = nullptr; - // bit 2: density - m_fdc->dden_w(BIT(data, 2)); - } - // bit 3: reset - if (BIT(data, 3)) m_fdc->soft_reset(); + m_drive_control = data; + + // bit 0: drive select + switch (BIT(data, 0)) + { + case 0: floppy = m_floppy0->get_device(); break; + case 1: floppy = m_floppy1->get_device(); break; + } + m_fdc->set_floppy(floppy); + + // Not sure why QFS 1.02 inverts these two bits, need to see an original board to verify + if (m_invert) + { + // bit 1: side select + if (floppy) + floppy->ss_w(!BIT(data, 1)); - // bit 4: interrupt enable - m_fdc_ie = BIT(data, 4); + // bit 2: density + m_fdc->dden_w(!BIT(data, 2)); + } + else + { + // bit 1: side select + if (floppy) + floppy->ss_w(BIT(data, 1)); + + // bit 2: density + m_fdc->dden_w(BIT(data, 2)); + } + // bit 3: reset + if (BIT(data, 3)) m_fdc->soft_reset(); + + // bit 4: interrupt enable + m_fdc_ie = BIT(data, 4); + } } WRITE_LINE_MEMBER(bbc_cumanafdc_device::fdc_intrq_w) @@ -208,12 +223,6 @@ WRITE_LINE_MEMBER(bbc_cumanafdc_device::fdc_drq_w) WRITE_LINE_MEMBER(bbc_cumanafdc_device::motor_w) { - for (int i = 0; i != 2; i++) { - char devname[8]; - sprintf(devname, "%d", i); - floppy_connector *con = m_fdc->subdevice<floppy_connector>(devname); - if (con) { - con->get_device()->mon_w(!state); - } - } + if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state); + if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state); } diff --git a/src/devices/bus/bbc/fdc/cumana.h b/src/devices/bus/bbc/fdc/cumana.h index 9b0c90c0630..71048da3b1a 100644 --- a/src/devices/bus/bbc/fdc/cumana.h +++ b/src/devices/bus/bbc/fdc/cumana.h @@ -23,7 +23,6 @@ class bbc_cumanafdc_device : public device_t, public device_bbc_fdc_interface - { public: DECLARE_FLOPPY_FORMATS(floppy_formats); @@ -31,8 +30,6 @@ public: DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); DECLARE_WRITE_LINE_MEMBER(motor_w); - DECLARE_READ8_MEMBER(ctrl_r); - DECLARE_WRITE8_MEMBER(ctrl_w); protected: // construction/destruction @@ -42,12 +39,15 @@ protected: virtual void device_start() override; virtual void device_reset() override; - bool m_invert; + virtual DECLARE_READ8_MEMBER(read) override; + virtual DECLARE_WRITE8_MEMBER(write) override; required_device<mb8877_device> m_fdc; required_device<floppy_connector> m_floppy0; optional_device<floppy_connector> m_floppy1; + bool m_invert; + private: required_memory_region m_dfs_rom; diff --git a/src/devices/bus/bbc/fdc/cv1797.cpp b/src/devices/bus/bbc/fdc/cv1797.cpp index d1baf8204d9..689d9a23777 100644 --- a/src/devices/bus/bbc/fdc/cv1797.cpp +++ b/src/devices/bus/bbc/fdc/cv1797.cpp @@ -58,6 +58,7 @@ void bbc_cv1797_device::device_add_mconfig(machine_config &config) m_fdc->intrq_wr_callback().set(FUNC(bbc_cv1797_device::fdc_intrq_w)); m_fdc->drq_wr_callback().set(FUNC(bbc_cv1797_device::fdc_drq_w)); m_fdc->hld_wr_callback().set(FUNC(bbc_cv1797_device::motor_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); } @@ -76,12 +77,13 @@ const tiny_rom_entry *bbc_cv1797_device::device_rom_region() const //------------------------------------------------- bbc_cv1797_device::bbc_cv1797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, BBC_CV1797, tag, owner, clock), - device_bbc_fdc_interface(mconfig, *this), - m_dfs_rom(*this, "dfs_rom"), - m_fdc(*this, "fd1797"), - m_floppy0(*this, "fd1797:0"), - m_floppy1(*this, "fd1797:1") + : device_t(mconfig, BBC_CV1797, tag, owner, clock) + , device_bbc_fdc_interface(mconfig, *this) + , m_dfs_rom(*this, "dfs_rom") + , m_fdc(*this, "fd1797") + , m_floppy0(*this, "fd1797:0") + , m_floppy1(*this, "fd1797:1") + , m_drive_control(0) { } @@ -91,12 +93,7 @@ bbc_cv1797_device::bbc_cv1797_device(const machine_config &mconfig, const char * void bbc_cv1797_device::device_start() { - device_t* cpu = machine().device("maincpu"); - address_space& space = cpu->memory().space(AS_PROGRAM); - m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner()); - - space.install_readwrite_handler(0xfe80, 0xfe80, read8sm_delegate(FUNC(fd1797_device::read), m_fdc.target()), write8sm_delegate(FUNC(fd1797_device::write), m_fdc.target())); - space.install_readwrite_handler(0xfe84, 0xfe9f, read8_delegate(FUNC(bbc_cv1797_device::fd1797l_read), this), write8_delegate(FUNC(bbc_cv1797_device::fd1797l_write), this)); + save_item(NAME(m_drive_control)); } //------------------------------------------------- @@ -106,8 +103,6 @@ void bbc_cv1797_device::device_start() void bbc_cv1797_device::device_reset() { machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base()); - - m_fdc->soft_reset(); } @@ -115,32 +110,51 @@ void bbc_cv1797_device::device_reset() // IMPLEMENTATION //************************************************************************** -READ8_MEMBER(bbc_cv1797_device::fd1797l_read) +READ8_MEMBER(bbc_cv1797_device::read) { - return m_drive_control; + uint8_t data; + + if (offset & 0x04) + { + data = m_fdc->read(offset & 0x03); + } + else + { + data = m_drive_control; + } + return data; } -WRITE8_MEMBER(bbc_cv1797_device::fd1797l_write) +WRITE8_MEMBER(bbc_cv1797_device::write) { - floppy_image_device *floppy = nullptr; - - m_drive_control = data; - logerror("fdc: Drive control %02x\n", data); - // bit 0: drive select - floppy_image_device *floppy0 = m_floppy0->get_device(); - floppy_image_device *floppy1 = m_floppy1->get_device(); - floppy = (BIT(data, 0) ? floppy1 : floppy0); - m_fdc->set_floppy(floppy); - - // bit 1: side select - if (floppy) - floppy->ss_w(BIT(data, 1)); - - // bit 2: density - m_fdc->dden_w(BIT(data, 2)); - - // bit 6: reset - //if (BIT(data, 6)) m_fdc->soft_reset(); + if (offset & 0x04) + { + m_fdc->write(offset & 0x03, data); + } + else + { + floppy_image_device *floppy = nullptr; + + m_drive_control = data; + logerror("fdc: Drive control %02x\n", data); + // bit 0: drive select + switch (BIT(data, 0)) + { + case 0: floppy = m_floppy0->get_device(); break; + case 1: floppy = m_floppy1->get_device(); break; + } + m_fdc->set_floppy(floppy); + + // bit 1: side select + if (floppy) + floppy->ss_w(BIT(data, 1)); + + // bit 2: density + m_fdc->dden_w(!BIT(data, 2)); + + // bit 6: reset + //if (BIT(data, 6)) m_fdc->soft_reset(); + } } WRITE_LINE_MEMBER(bbc_cv1797_device::fdc_intrq_w) diff --git a/src/devices/bus/bbc/fdc/cv1797.h b/src/devices/bus/bbc/fdc/cv1797.h index b03385810f2..b6a2f3c9a44 100644 --- a/src/devices/bus/bbc/fdc/cv1797.h +++ b/src/devices/bus/bbc/fdc/cv1797.h @@ -24,7 +24,6 @@ class bbc_cv1797_device : public device_t, public device_bbc_fdc_interface - { public: static constexpr feature_type imperfect_features() { return feature::DISK; } @@ -41,11 +40,12 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; + virtual DECLARE_READ8_MEMBER(read) override; + virtual DECLARE_WRITE8_MEMBER(write) override; + private: DECLARE_FLOPPY_FORMATS(floppy_formats); - DECLARE_READ8_MEMBER(fd1797l_read); - DECLARE_WRITE8_MEMBER(fd1797l_write); DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); DECLARE_WRITE_LINE_MEMBER(motor_w); diff --git a/src/devices/bus/bbc/fdc/fdc.cpp b/src/devices/bus/bbc/fdc/fdc.cpp index 5db09a3903e..1db62be6357 100644 --- a/src/devices/bus/bbc/fdc/fdc.cpp +++ b/src/devices/bus/bbc/fdc/fdc.cpp @@ -32,15 +32,6 @@ device_bbc_fdc_interface::device_bbc_fdc_interface(const machine_config &mconfig } -//------------------------------------------------- -// ~device_bbc_fdc_interface - destructor -//------------------------------------------------- - -device_bbc_fdc_interface::~device_bbc_fdc_interface() -{ -} - - //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -53,17 +44,8 @@ bbc_fdc_slot_device::bbc_fdc_slot_device(const machine_config &mconfig, const ch device_t(mconfig, BBC_FDC_SLOT, tag, owner, clock), device_slot_interface(mconfig, *this), m_card(nullptr), - m_intrq_handler(*this), - m_drq_handler(*this) -{ -} - - -//------------------------------------------------- -// bbc_fdc_slot_device - destructor -//------------------------------------------------- - -bbc_fdc_slot_device::~bbc_fdc_slot_device() + m_intrq_cb(*this), + m_drq_cb(*this) { } @@ -86,12 +68,13 @@ void bbc_fdc_slot_device::device_validity_check(validity_checker &valid) const void bbc_fdc_slot_device::device_start() { device_t *const carddev = get_card_device(); - if (carddev && !dynamic_cast<device_bbc_fdc_interface *>(carddev)) + m_card = dynamic_cast<device_bbc_fdc_interface *>(get_card_device()); + if (carddev && !m_card) osd_printf_error("Card device %s (%s) does not implement device_bbc_fdc_interface\n", carddev->tag(), carddev->name()); // resolve callbacks - m_intrq_handler.resolve_safe(); - m_drq_handler.resolve_safe(); + m_intrq_cb.resolve_safe(); + m_drq_cb.resolve_safe(); } //------------------------------------------------- @@ -102,6 +85,27 @@ void bbc_fdc_slot_device::device_reset() { } +//------------------------------------------------- +// read +//------------------------------------------------- + +READ8_MEMBER(bbc_fdc_slot_device::read) +{ + if (m_card) + return m_card->read(space, offset); + else + return 0xff; +} + +//------------------------------------------------- +// write +//------------------------------------------------- + +WRITE8_MEMBER(bbc_fdc_slot_device::write) +{ + if (m_card) + m_card->write(space, offset, data); +} //------------------------------------------------- // SLOT_INTERFACE( bbc_fdc_devices ) @@ -110,9 +114,10 @@ void bbc_fdc_slot_device::device_reset() // slot devices #include "acorn.h" +#include "ams.h" #include "cumana.h" #include "cv1797.h" -//#include "microware.h" +#include "microware.h" #include "opus.h" //#include "solidisk.h" #include "watford.h" @@ -123,10 +128,11 @@ void bbc_fdc_devices(device_slot_interface &device) { device.option_add("acorn8271", BBC_ACORN8271); device.option_add("acorn1770", BBC_ACORN1770); + device.option_add("ams3", BBC_AMS3); device.option_add("cumana1", BBC_CUMANA1); device.option_add("cumana2", BBC_CUMANA2); device.option_add("cv1797", BBC_CV1797); - //device.option_add("microware", BBC_MICROWARE); + device.option_add("microware", BBC_MICROWARE); device.option_add("opus8272", BBC_OPUS8272); device.option_add("opus2791", BBC_OPUS2791); device.option_add("opus2793", BBC_OPUS2793); diff --git a/src/devices/bus/bbc/fdc/fdc.h b/src/devices/bus/bbc/fdc/fdc.h index 892db41fe1d..2b61b881e1a 100644 --- a/src/devices/bus/bbc/fdc/fdc.h +++ b/src/devices/bus/bbc/fdc/fdc.h @@ -14,21 +14,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_BBC_FDC_SLOT_ADD(_tag, _slot_intf, _def_slot, _fixed) \ - MCFG_DEVICE_ADD(_tag, BBC_FDC_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed) - -#define MCFG_BBC_FDC_SLOT_INTRQ_HANDLER(_devcb) \ - downcast<bbc_fdc_slot_device &>(*device).set_intrq_handler(DEVCB_##_devcb); - -#define MCFG_BBC_FDC_SLOT_DRQ_HANDLER(_devcb) \ - downcast<bbc_fdc_slot_device &>(*device).set_drq_handler(DEVCB_##_devcb); - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -40,15 +25,27 @@ class bbc_fdc_slot_device : public device_t, public device_slot_interface { public: // construction/destruction - bbc_fdc_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~bbc_fdc_slot_device(); + template <typename T> + bbc_fdc_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option) + : bbc_fdc_slot_device(mconfig, tag, owner) + { + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(false); + } + + bbc_fdc_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); // callbacks - template <class Object> devcb_base &set_intrq_handler(Object &&cb) { return m_intrq_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward<Object>(cb)); } + auto intrq_wr_callback() { return m_intrq_cb.bind(); } + auto drq_wr_callback() { return m_drq_cb.bind(); } - DECLARE_WRITE_LINE_MEMBER( intrq_w ) { m_intrq_handler(state); } - DECLARE_WRITE_LINE_MEMBER( drq_w) { m_drq_handler(state); } + virtual DECLARE_READ8_MEMBER(read); + virtual DECLARE_WRITE8_MEMBER(write); + + DECLARE_WRITE_LINE_MEMBER( intrq_w ) { m_intrq_cb(state); } + DECLARE_WRITE_LINE_MEMBER( drq_w) { m_drq_cb(state); } protected: // device-level overrides @@ -59,8 +56,8 @@ protected: device_bbc_fdc_interface *m_card; private: - devcb_write_line m_intrq_handler; - devcb_write_line m_drq_handler; + devcb_write_line m_intrq_cb; + devcb_write_line m_drq_cb; }; @@ -69,8 +66,8 @@ private: class device_bbc_fdc_interface : public device_slot_card_interface { public: - // construction/destruction - virtual ~device_bbc_fdc_interface(); + virtual DECLARE_READ8_MEMBER(read) { return 0xff; } + virtual DECLARE_WRITE8_MEMBER(write) { } protected: device_bbc_fdc_interface(const machine_config &mconfig, device_t &device); diff --git a/src/devices/bus/bbc/fdc/microware.cpp b/src/devices/bus/bbc/fdc/microware.cpp new file mode 100644 index 00000000000..2dc527ea822 --- /dev/null +++ b/src/devices/bus/bbc/fdc/microware.cpp @@ -0,0 +1,176 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + United Disk Memories DDFS FDC + + Microware DDFS FDC + +**********************************************************************/ + + +#include "emu.h" +#include "microware.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(BBC_MICROWARE, bbc_microware_device, "bbc_microware", "Microware DDFS FDC") + + +//------------------------------------------------- +// MACHINE_DRIVER( microware ) +//------------------------------------------------- + +FLOPPY_FORMATS_MEMBER( bbc_microware_device::floppy_formats ) + FLOPPY_ACORN_SSD_FORMAT, + FLOPPY_ACORN_DSD_FORMAT, + FLOPPY_FSD_FORMAT +FLOPPY_FORMATS_END + +static void bbc_floppies_525(device_slot_interface &device) +{ + device.option_add("525sssd", FLOPPY_525_SSSD); + device.option_add("525sd", FLOPPY_525_SD); + device.option_add("525ssdd", FLOPPY_525_SSDD); + device.option_add("525dd", FLOPPY_525_DD); + device.option_add("525qd", FLOPPY_525_QD); +} + +ROM_START( microware ) + ROM_REGION(0x4000, "dfs_rom", 0) + ROM_DEFAULT_BIOS("udm200") + ROM_SYSTEM_BIOS(0, "ddfs090", "Microware DDFS 0.90") + ROMX_LOAD("microware_ddfs090.rom", 0x0000, 0x4000, CRC(700d50e5) SHA1(6834e46cb15354003d553e6c2bdb4ed76b47a465), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "udm200", "UDM DDFS 2.00") + ROMX_LOAD("udm_ddfs200.rom", 0x0000, 0x4000, CRC(1b4708a2) SHA1(0f37bcc73a758657cfe58c19f0cc92be9107e767), ROM_BIOS(1)) +ROM_END + + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void bbc_microware_device::device_add_mconfig(machine_config &config) +{ + WD2793(config, m_fdc, 16_MHz_XTAL / 16); // Replay advert suggests Type R8272 UDM DFS + m_fdc->intrq_wr_callback().set(FUNC(bbc_microware_device::fdc_intrq_w)); + m_fdc->drq_wr_callback().set(FUNC(bbc_microware_device::fdc_drq_w)); + m_fdc->hld_wr_callback().set(FUNC(bbc_microware_device::motor_w)); + + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); +} + +const tiny_rom_entry *bbc_microware_device::device_rom_region() const +{ + return ROM_NAME( microware ); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bbc_microware_device - constructor +//------------------------------------------------- + +bbc_microware_device::bbc_microware_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, BBC_MICROWARE, tag, owner, clock) + , device_bbc_fdc_interface(mconfig, *this) + , m_dfs_rom(*this, "dfs_rom") + , m_fdc(*this, "wd2793") + , m_floppy0(*this, "wd2793:0") + , m_floppy1(*this, "wd2793:1") + , m_drive_control(0) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bbc_microware_device::device_start() +{ + save_item(NAME(m_drive_control)); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void bbc_microware_device::device_reset() +{ + machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base()); +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +READ8_MEMBER(bbc_microware_device::read) +{ + uint8_t data; + + if (offset & 0x04) + { + data = m_fdc->read(offset & 0x03); + } + else + { + data = m_drive_control; + } + return data; +} + +WRITE8_MEMBER(bbc_microware_device::write) +{ + if (offset & 0x04) + { + m_fdc->write(offset & 0x03, data); + } + else + { + floppy_image_device *floppy = nullptr; + + m_drive_control = data; + logerror("fdc: Drive control %02x \n", data); + // bit 0: drive select + switch (BIT(data, 0)) + { + case 0: floppy = m_floppy0->get_device(); break; + case 1: floppy = m_floppy1->get_device(); break; + } + m_fdc->set_floppy(floppy); + + // bit 1: side select + if (floppy) + floppy->ss_w(BIT(data, 1)); + + // bit 2: density + m_fdc->dden_w(BIT(data, 2)); + + // bit 3: always set ??? + + // bit 4: ??? interrupt + } +} + +WRITE_LINE_MEMBER(bbc_microware_device::fdc_intrq_w) +{ + m_slot->intrq_w(state); +} + +WRITE_LINE_MEMBER(bbc_microware_device::fdc_drq_w) +{ + m_slot->drq_w(state); +} + +WRITE_LINE_MEMBER(bbc_microware_device::motor_w) +{ + if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state); + if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state); +} diff --git a/src/devices/bus/bbc/fdc/microware.h b/src/devices/bus/bbc/fdc/microware.h new file mode 100644 index 00000000000..9d42eb2b668 --- /dev/null +++ b/src/devices/bus/bbc/fdc/microware.h @@ -0,0 +1,68 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + United Disk Memories DDFS FDC + + Microware DDFS FDC + +**********************************************************************/ + + +#ifndef MAME_BUS_BBC_FDC_MICROWARE_H +#define MAME_BUS_BBC_FDC_MICROWARE_H + +#pragma once + +#include "fdc.h" +#include "machine/wd_fdc.h" +#include "formats/acorn_dsk.h" +#include "formats/fsd_dsk.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class bbc_microware_device : + public device_t, + public device_bbc_fdc_interface +{ +public: + static constexpr feature_type imperfect_features() { return feature::DISK; } + + // construction/destruction + bbc_microware_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual DECLARE_READ8_MEMBER(read) override; + virtual DECLARE_WRITE8_MEMBER(write) override; + +private: + DECLARE_FLOPPY_FORMATS(floppy_formats); + + DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); + DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); + DECLARE_WRITE_LINE_MEMBER(motor_w); + + required_memory_region m_dfs_rom; + required_device<wd2793_device> m_fdc; + required_device<floppy_connector> m_floppy0; + optional_device<floppy_connector> m_floppy1; + + int m_drive_control; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(BBC_MICROWARE, bbc_microware_device); + + +#endif /* MAME_BUS_BBC_FDC_MICROWARE_H */ diff --git a/src/devices/bus/bbc/fdc/opus.cpp b/src/devices/bus/bbc/fdc/opus.cpp index c336cd71a24..85eb8f5e7e9 100644 --- a/src/devices/bus/bbc/fdc/opus.cpp +++ b/src/devices/bus/bbc/fdc/opus.cpp @@ -94,6 +94,7 @@ void bbc_opus8272_device::device_add_mconfig(machine_config &config) I8272A(config, m_fdc, 0); m_fdc->set_ready_line_connected(true); m_fdc->intrq_wr_callback().set(FUNC(bbc_opus8272_device::fdc_intrq_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true); } @@ -103,6 +104,7 @@ void bbc_opus2791_device::device_add_mconfig(machine_config &config) WD2791(config, m_fdc, 16_MHz_XTAL / 16); m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w)); m_fdc->hld_wr_callback().set(FUNC(bbc_opusfdc_device::motor_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true); } @@ -112,6 +114,7 @@ void bbc_opus2793_device::device_add_mconfig(machine_config &config) WD2793(config, m_fdc, 16_MHz_XTAL / 16); m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w)); m_fdc->hld_wr_callback().set(FUNC(bbc_opusfdc_device::motor_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true); } @@ -120,6 +123,7 @@ void bbc_opus1770_device::device_add_mconfig(machine_config &config) { WD1770(config, m_fdc, 16_MHz_XTAL / 2); m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true); } @@ -169,7 +173,8 @@ bbc_opusfdc_device::bbc_opusfdc_device(const machine_config &mconfig, device_typ m_fdc(*this, "fdc"), m_floppy0(*this, "fdc:0"), m_floppy1(*this, "fdc:1"), - m_dfs_rom(*this, "dfs_rom") + m_dfs_rom(*this, "dfs_rom"), + m_drive_control(0) { } @@ -194,21 +199,11 @@ bbc_opus1770_device::bbc_opus1770_device(const machine_config &mconfig, const ch void bbc_opus8272_device::device_start() { - device_t* cpu = machine().device("maincpu"); - address_space& space = cpu->memory().space(AS_PROGRAM); - m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner()); - - space.install_readwrite_handler(0xfe80, 0xfe86, READ8_DELEGATE(bbc_opus8272_device, fdc_r), WRITE8_DELEGATE(bbc_opus8272_device, fdc_w)); } void bbc_opusfdc_device::device_start() { - device_t* cpu = machine().device("maincpu"); - address_space& space = cpu->memory().space(AS_PROGRAM); - m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner()); - - space.install_readwrite_handler(0xfe80, 0xfe83, read8sm_delegate(FUNC(wd_fdc_device_base::read), m_fdc.target()), write8sm_delegate(FUNC(wd_fdc_device_base::write), m_fdc.target())); - space.install_readwrite_handler(0xfe84, 0xfe84, READ8_DELEGATE(bbc_opusfdc_device, ctrl_r), WRITE8_DELEGATE(bbc_opusfdc_device, ctrl_w)); + save_item(NAME(m_drive_control)); } //------------------------------------------------- @@ -218,15 +213,11 @@ void bbc_opusfdc_device::device_start() void bbc_opus8272_device::device_reset() { machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base()); - - m_fdc->soft_reset(); } void bbc_opusfdc_device::device_reset() { machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base()); - - m_fdc->soft_reset(); } @@ -234,11 +225,11 @@ void bbc_opusfdc_device::device_reset() // IMPLEMENTATION //************************************************************************** -READ8_MEMBER(bbc_opus8272_device::fdc_r) +READ8_MEMBER(bbc_opus8272_device::read) { uint8_t data = 0xff; - switch (offset) + switch (offset & 0x07) { case 0x02: m_fdc->tc_w(true); @@ -262,11 +253,11 @@ READ8_MEMBER(bbc_opus8272_device::fdc_r) return data; } -WRITE8_MEMBER(bbc_opus8272_device::fdc_w) +WRITE8_MEMBER(bbc_opus8272_device::write) { floppy_image_device *floppy = nullptr; - switch (offset) + switch (offset & 0x07) { case 0x01: switch (data & 0x01) @@ -292,31 +283,48 @@ WRITE_LINE_MEMBER(bbc_opus8272_device::fdc_intrq_w) } -READ8_MEMBER(bbc_opusfdc_device::ctrl_r) +READ8_MEMBER(bbc_opusfdc_device::read) { - return m_drive_control; + uint8_t data; + + if (offset & 0x04) + { + data = m_drive_control; + } + else + { + data = m_fdc->read(offset & 0x03); + } + return data; } -WRITE8_MEMBER(bbc_opusfdc_device::ctrl_w) +WRITE8_MEMBER(bbc_opusfdc_device::write) { - floppy_image_device *floppy = nullptr; + if (offset & 0x04) + { + floppy_image_device *floppy = nullptr; - m_drive_control = data; + m_drive_control = data; - // bit 0: drive select - switch (BIT(data, 0)) - { - case 0: floppy = m_floppy0->get_device(); break; - case 1: floppy = m_floppy1->get_device(); break; - } - m_fdc->set_floppy(floppy); + // bit 0: drive select + switch (BIT(data, 0)) + { + case 0: floppy = m_floppy0->get_device(); break; + case 1: floppy = m_floppy1->get_device(); break; + } + m_fdc->set_floppy(floppy); - // bit 1: side select - if (floppy) - floppy->ss_w(BIT(data, 1)); + // bit 1: side select + if (floppy) + floppy->ss_w(BIT(data, 1)); - // bit 6: density - m_fdc->dden_w(!BIT(data, 6)); + // bit 6: density + m_fdc->dden_w(!BIT(data, 6)); + } + else + { + m_fdc->write(offset & 0x03, data); + } } WRITE_LINE_MEMBER(bbc_opusfdc_device::fdc_drq_w) diff --git a/src/devices/bus/bbc/fdc/opus.h b/src/devices/bus/bbc/fdc/opus.h index 64ed0c61fe6..86af3dfe370 100644 --- a/src/devices/bus/bbc/fdc/opus.h +++ b/src/devices/bus/bbc/fdc/opus.h @@ -22,7 +22,6 @@ class bbc_opus8272_device : public device_t, public device_bbc_fdc_interface - { public: // construction/destruction @@ -37,9 +36,10 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; + virtual DECLARE_READ8_MEMBER(read) override; + virtual DECLARE_WRITE8_MEMBER(write) override; + private: - DECLARE_READ8_MEMBER(fdc_r); - DECLARE_WRITE8_MEMBER(fdc_w); DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); required_memory_region m_dfs_rom; @@ -49,19 +49,15 @@ private: }; -class bbc_opusfdc_device: +class bbc_opusfdc_device : public device_t, public device_bbc_fdc_interface - { public: DECLARE_FLOPPY_FORMATS(floppy_formats); - DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); DECLARE_WRITE_LINE_MEMBER(motor_w); - DECLARE_READ8_MEMBER(ctrl_r); - DECLARE_WRITE8_MEMBER(ctrl_w); protected: // construction/destruction @@ -71,6 +67,9 @@ protected: virtual void device_start() override; virtual void device_reset() override; + virtual DECLARE_READ8_MEMBER(read) override; + virtual DECLARE_WRITE8_MEMBER(write) override; + required_device<wd_fdc_device_base> m_fdc; required_device<floppy_connector> m_floppy0; optional_device<floppy_connector> m_floppy1; diff --git a/src/devices/bus/bbc/fdc/watford.cpp b/src/devices/bus/bbc/fdc/watford.cpp index 10c56e9cfce..be7f17dea80 100644 --- a/src/devices/bus/bbc/fdc/watford.cpp +++ b/src/devices/bus/bbc/fdc/watford.cpp @@ -70,6 +70,7 @@ void bbc_weddb2_device::device_add_mconfig(machine_config &config) WD1772(config, m_fdc, 16_MHz_XTAL / 2); m_fdc->intrq_wr_callback().set(FUNC(bbc_weddb2_device::fdc_intrq_w)); m_fdc->drq_wr_callback().set(FUNC(bbc_weddb2_device::fdc_drq_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); } @@ -79,6 +80,7 @@ void bbc_weddb3_device::device_add_mconfig(machine_config &config) WD1770(config, m_fdc, 16_MHz_XTAL / 2); m_fdc->intrq_wr_callback().set(FUNC(bbc_weddb3_device::fdc_intrq_w)); m_fdc->drq_wr_callback().set(FUNC(bbc_weddb3_device::fdc_drq_w)); + FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true); } @@ -102,27 +104,29 @@ const tiny_rom_entry *bbc_weddb3_device::device_rom_region() const // bbc_watfordfdc_device - constructor //------------------------------------------------- -bbc_watfordfdc_device::bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, type, tag, owner, clock), - device_bbc_fdc_interface(mconfig, *this) +bbc_watfordfdc_device::bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , device_bbc_fdc_interface(mconfig, *this) { } bbc_weddb2_device::bbc_weddb2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : bbc_watfordfdc_device(mconfig, BBC_WEDDB2, tag, owner, clock), - m_dfs_rom(*this, "dfs_rom"), - m_fdc(*this, "wd1772"), - m_floppy0(*this, "wd1772:0"), - m_floppy1(*this, "wd1772:1") + : bbc_watfordfdc_device(mconfig, BBC_WEDDB2, tag, owner, clock) + , m_dfs_rom(*this, "dfs_rom") + , m_fdc(*this, "wd1772") + , m_floppy0(*this, "wd1772:0") + , m_floppy1(*this, "wd1772:1") + , m_drive_control(0) { } bbc_weddb3_device::bbc_weddb3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : bbc_watfordfdc_device(mconfig, BBC_WEDDB3, tag, owner, clock), - m_dfs_rom(*this, "dfs_rom"), - m_fdc(*this, "wd1770"), - m_floppy0(*this, "wd1770:0"), - m_floppy1(*this, "wd1770:1") + : bbc_watfordfdc_device(mconfig, BBC_WEDDB3, tag, owner, clock) + , m_dfs_rom(*this, "dfs_rom") + , m_fdc(*this, "wd1770") + , m_floppy0(*this, "wd1770:0") + , m_floppy1(*this, "wd1770:1") + , m_drive_control(0) { } @@ -132,22 +136,12 @@ bbc_weddb3_device::bbc_weddb3_device(const machine_config &mconfig, const char * void bbc_weddb2_device::device_start() { - device_t* cpu = machine().device("maincpu"); - address_space& space = cpu->memory().space(AS_PROGRAM); - m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner()); - - space.install_readwrite_handler(0xfe80, 0xfe83, read8_delegate(FUNC(bbc_weddb2_device::wd177xl_read), this), write8_delegate(FUNC(bbc_weddb2_device::wd177xl_write), this)); - space.install_readwrite_handler(0xfe84, 0xfe8f, read8sm_delegate(FUNC(wd_fdc_device_base::read), m_fdc.target()), write8sm_delegate(FUNC(wd_fdc_device_base::write), m_fdc.target())); + save_item(NAME(m_drive_control)); } void bbc_weddb3_device::device_start() { - device_t* cpu = machine().device("maincpu"); - address_space& space = cpu->memory().space(AS_PROGRAM); - m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner()); - - space.install_readwrite_handler(0xfe80, 0xfe83, read8_delegate(FUNC(bbc_weddb3_device::wd177xl_read), this), write8_delegate(FUNC(bbc_weddb3_device::wd177xl_write), this)); - space.install_readwrite_handler(0xfe84, 0xfe8f, read8sm_delegate(FUNC(wd_fdc_device_base::read), m_fdc.target()), write8sm_delegate(FUNC(wd_fdc_device_base::write), m_fdc.target())); + save_item(NAME(m_drive_control)); } //------------------------------------------------- @@ -169,59 +163,93 @@ void bbc_weddb3_device::device_reset() // IMPLEMENTATION //************************************************************************** -READ8_MEMBER(bbc_weddb2_device::wd177xl_read) +READ8_MEMBER(bbc_weddb2_device::read) { - return m_drive_control; + uint8_t data; + + if (offset & 0x04) + { + data = m_fdc->read(offset & 0x03); + } + else + { + data = m_drive_control; + } + return data; } -WRITE8_MEMBER(bbc_weddb2_device::wd177xl_write) +WRITE8_MEMBER(bbc_weddb2_device::write) { - floppy_image_device *floppy = nullptr; - - m_drive_control = data; - - // bit 2: drive select - floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device(); - floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device(); - floppy = (BIT(data, 2) ? floppy1 : floppy0); - m_fdc->set_floppy(floppy); - - // bit 0: density - m_fdc->dden_w(BIT(data, 0)); - - // bit 1: side select - if (floppy) - floppy->ss_w(BIT(data, 1)); - - // bit 3: reset - if (!BIT(data, 3)) m_fdc->soft_reset(); + if (offset & 0x04) + { + m_fdc->write(offset & 0x03, data); + } + else + { + floppy_image_device *floppy = nullptr; + + m_drive_control = data; + + // bit 2: drive select + floppy_image_device *floppy0 = m_floppy0->get_device(); + floppy_image_device *floppy1 = m_floppy1->get_device(); + floppy = (BIT(data, 2) ? floppy1 : floppy0); + m_fdc->set_floppy(floppy); + + // bit 0: density + m_fdc->dden_w(BIT(data, 0)); + + // bit 1: side select + if (floppy) + floppy->ss_w(BIT(data, 1)); + + // bit 3: reset + if (!BIT(data, 3)) m_fdc->soft_reset(); + } } -READ8_MEMBER(bbc_weddb3_device::wd177xl_read) +READ8_MEMBER(bbc_weddb3_device::read) { - return m_drive_control; + uint8_t data; + + if (offset & 0x04) + { + data = m_fdc->read(offset & 0x03); + } + else + { + data = m_drive_control; + } + return data; } -WRITE8_MEMBER(bbc_weddb3_device::wd177xl_write) +WRITE8_MEMBER(bbc_weddb3_device::write) { - floppy_image_device *floppy = nullptr; - - m_drive_control = data; - - // bit 0, 1: drive select - if (BIT(data, 0)) floppy = m_fdc->subdevice<floppy_connector>("0")->get_device(); - if (BIT(data, 1)) floppy = m_fdc->subdevice<floppy_connector>("1")->get_device(); - m_fdc->set_floppy(floppy); - - // bit 2: side select - if (floppy) - floppy->ss_w(BIT(data, 2)); - - // bit 3: density - m_fdc->dden_w(BIT(data, 3)); - - // bit 5: reset - if (!BIT(data, 5)) m_fdc->soft_reset(); + if (offset & 0x04) + { + m_fdc->write(offset & 0x03, data); + } + else + { + floppy_image_device *floppy = nullptr; + + m_drive_control = data; + + // bit 0, 1: drive select + if (BIT(data, 0)) floppy = m_floppy0->get_device(); + if (BIT(data, 1)) floppy = m_floppy1->get_device(); + m_fdc->set_floppy(floppy); + + // bit 2: side select + if (floppy) + floppy->ss_w(BIT(data, 2)); + + // bit 3: density + m_fdc->dden_w(BIT(data, 3)); + + // bit 5: reset + if (!BIT(data, 5)) m_fdc->soft_reset(); + } } WRITE_LINE_MEMBER(bbc_watfordfdc_device::fdc_intrq_w) diff --git a/src/devices/bus/bbc/fdc/watford.h b/src/devices/bus/bbc/fdc/watford.h index ddc266d83ed..2f03f24eb0f 100644 --- a/src/devices/bus/bbc/fdc/watford.h +++ b/src/devices/bus/bbc/fdc/watford.h @@ -23,18 +23,16 @@ class bbc_watfordfdc_device : public device_t, public device_bbc_fdc_interface - { public: + DECLARE_FLOPPY_FORMATS(floppy_formats); + DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); + DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); protected: // construction/destruction bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - DECLARE_FLOPPY_FORMATS(floppy_formats); - - DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); - DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); }; class bbc_weddb2_device : public bbc_watfordfdc_device @@ -42,9 +40,6 @@ class bbc_weddb2_device : public bbc_watfordfdc_device public: bbc_weddb2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - DECLARE_READ8_MEMBER(wd177xl_read); - DECLARE_WRITE8_MEMBER(wd177xl_write); - protected: // device-level overrides virtual void device_start() override; @@ -53,6 +48,9 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; + virtual DECLARE_READ8_MEMBER(read) override; + virtual DECLARE_WRITE8_MEMBER(write) override; + private: required_memory_region m_dfs_rom; required_device<wd_fdc_device_base> m_fdc; @@ -67,9 +65,6 @@ class bbc_weddb3_device : public bbc_watfordfdc_device public: bbc_weddb3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - DECLARE_READ8_MEMBER(wd177xl_read); - DECLARE_WRITE8_MEMBER(wd177xl_write); - protected: // device-level overrides virtual void device_start() override; @@ -78,6 +73,9 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; + virtual DECLARE_READ8_MEMBER(read) override; + virtual DECLARE_WRITE8_MEMBER(write) override; + private: required_memory_region m_dfs_rom; required_device<wd_fdc_device_base> m_fdc; diff --git a/src/devices/bus/bbc/joyport/joyport.cpp b/src/devices/bus/bbc/joyport/joyport.cpp index b45b804a76c..5ed3f8d2fff 100644 --- a/src/devices/bus/bbc/joyport/joyport.cpp +++ b/src/devices/bus/bbc/joyport/joyport.cpp @@ -32,15 +32,6 @@ device_bbc_joyport_interface::device_bbc_joyport_interface(const machine_config } -//------------------------------------------------- -// ~device_bbc_joyport_interface - destructor -//------------------------------------------------- - -device_bbc_joyport_interface::~device_bbc_joyport_interface() -{ -} - - //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -102,8 +93,9 @@ void bbc_joyport_slot_device::device_reset() READ8_MEMBER(bbc_joyport_slot_device::pb_r) { + // TODO: Joyport connected to PB0-PB4 only. PB5-PB7 are expansion port. if (m_device) - return m_device->pb_r(space, 0); + return 0xe0 | m_device->pb_r(space, 0); else return 0xff; } diff --git a/src/devices/bus/bbc/joyport/joyport.h b/src/devices/bus/bbc/joyport/joyport.h index a11e39a38ec..572e41f7612 100644 --- a/src/devices/bus/bbc/joyport/joyport.h +++ b/src/devices/bus/bbc/joyport/joyport.h @@ -34,20 +34,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_BBC_JOYPORT_ADD( _tag, _slot_intf, _def_slot) \ - MCFG_DEVICE_ADD(_tag, BBC_JOYPORT_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) - -#define MCFG_BBC_JOYPORT_CB1_HANDLER(_devcb) \ - downcast<bbc_joyport_slot_device &>(*device).set_cb1_handler(DEVCB_##_devcb); - -#define MCFG_BBC_JOYPORT_CB2_HANDLER(_devcb) \ - downcast<bbc_joyport_slot_device &>(*device).set_cb2_handler(DEVCB_##_devcb); - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -59,11 +45,21 @@ class bbc_joyport_slot_device : public device_t, public device_slot_interface { public: // construction/destruction - bbc_joyport_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + template <typename T> + bbc_joyport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option) + : bbc_joyport_slot_device(mconfig, tag, owner) + { + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(false); + } + + bbc_joyport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); // callbacks - template <class Object> devcb_base &set_cb1_handler(Object &&cb) { return m_cb1_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_cb2_handler(Object &&cb) { return m_cb2_handler.set_callback(std::forward<Object>(cb)); } + auto cb1_handler() { return m_cb1_handler.bind(); } + auto cb2_handler() { return m_cb2_handler.bind(); } DECLARE_WRITE_LINE_MEMBER(cb1_w) { m_cb1_handler(state); } DECLARE_WRITE_LINE_MEMBER(cb2_w) { m_cb2_handler(state); } @@ -90,9 +86,6 @@ private: class device_bbc_joyport_interface : public device_slot_card_interface { public: - // construction/destruction - virtual ~device_bbc_joyport_interface(); - virtual DECLARE_READ8_MEMBER(pb_r) { return 0xff; } virtual DECLARE_WRITE8_MEMBER(pb_w) { } diff --git a/src/devices/bus/bbc/tube/tube.cpp b/src/devices/bus/bbc/tube/tube.cpp index f3824e872cf..c69b57cd45f 100644 --- a/src/devices/bus/bbc/tube/tube.cpp +++ b/src/devices/bus/bbc/tube/tube.cpp @@ -34,16 +34,6 @@ device_bbc_tube_interface::device_bbc_tube_interface(const machine_config &mconf } -//------------------------------------------------- -// ~device_bbc_tube_interface - destructor -//------------------------------------------------- - -device_bbc_tube_interface::~device_bbc_tube_interface() -{ -} - - - //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -62,15 +52,6 @@ bbc_tube_slot_device::bbc_tube_slot_device(const machine_config &mconfig, const //------------------------------------------------- -// bbc_tube_slot_device - destructor -//------------------------------------------------- - -bbc_tube_slot_device::~bbc_tube_slot_device() -{ -} - - -//------------------------------------------------- // device_validity_check - //------------------------------------------------- @@ -135,8 +116,10 @@ WRITE8_MEMBER(bbc_tube_slot_device::host_w) #include "tube_65c102.h" #include "tube_80186.h" #include "tube_80286.h" +//#include "tube_a500.h" #include "tube_arm.h" #include "tube_casper.h" +//#include "tube_pmsb2p.h" //#include "tube_x25.h" #include "tube_z80.h" #include "tube_zep100.h" @@ -151,12 +134,16 @@ void bbc_extube_devices(device_slot_interface &device) device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */ device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */ // device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */ -// device.option_add("camb", BBC_TUBE_CAMB); /* Acorn ANC06 Cambridge Co-Processor */ device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */ device.option_add("80286", BBC_TUBE_80286); /* Acorn 80286 2nd Processor */ -// device.option_add("a500", BBC_TUBE_A500); /* Acorn A500 2nd Processor */ + //device.option_add("a500", BBC_TUBE_A500); /* Acorn A500 2nd Processor */ device.option_add("casper", BBC_TUBE_CASPER); /* Casper 68000 2nd Processor */ - device.option_add("zep100", BBC_TUBE_ZEP100); /* Torch Z80 Communicator (ZEP100) */ + //device.option_add("pmsb2p", BBC_TUBE_PMSB2P); /* PMS B2P-6502 */ + //device.option_add("hdp68k", BBC_TUBE_HDP68K); /* Torch Unicorn (HDP68K) */ + device.option_add("zep100", BBC_TUBE_ZEP100); /* Torch Z80 Communicator (ZEP100) (Torch) */ + //device.option_add("zep100l", BBC_TUBE_ZEP100L); /* Torch Z80 Communicator (ZEP100) (Acorn 8271) */ + //device.option_add("zep100w", BBC_TUBE_ZEP100W); /* Torch Z80 Communicator (ZEP100) (Acorn 1770) */ + //device.option_add("zep100m", BBC_TUBE_ZEP100M); /* Torch Z80 Communicator (ZEP100) (Master) */ /* Acorn ANC21 Universal 2nd Processor Unit */ device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */ device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */ @@ -176,6 +163,19 @@ void bbc_intube_devices(device_slot_interface &device) //------------------------------------------------- +// SLOT_INTERFACE( electron_tube_devices ) +//------------------------------------------------- + +void electron_tube_devices(device_slot_interface &device) +{ + device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */ + device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */ + device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */ + device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */ + device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */ +} + +//------------------------------------------------- // SLOT_INTERFACE( bbc_x25tube_devices ) //------------------------------------------------- diff --git a/src/devices/bus/bbc/tube/tube.h b/src/devices/bus/bbc/tube/tube.h index 722207d8d93..1bcc413c8ac 100644 --- a/src/devices/bus/bbc/tube/tube.h +++ b/src/devices/bus/bbc/tube/tube.h @@ -39,25 +39,6 @@ //************************************************************************** -// CONSTANTS -//************************************************************************** - -#define BBC_TUBE_SLOT_TAG "tube" - - -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_BBC_TUBE_SLOT_ADD(_tag, _slot_intf, _def_slot) \ - MCFG_DEVICE_ADD(_tag, BBC_TUBE_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) - -#define MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(_devcb) \ - downcast<bbc_tube_slot_device &>(*device).set_irq_handler(DEVCB_##_devcb); - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -70,11 +51,20 @@ class bbc_tube_slot_device : public device_t, public device_slot_interface { public: // construction/destruction - bbc_tube_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~bbc_tube_slot_device(); + template <typename T> + bbc_tube_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option) + : bbc_tube_slot_device(mconfig, tag, owner) + { + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(false); + } + + bbc_tube_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); // callbacks - template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); } + auto irq_handler() { return m_irq_handler.bind(); } DECLARE_READ8_MEMBER( host_r ); DECLARE_WRITE8_MEMBER( host_w ); @@ -99,9 +89,6 @@ private: class device_bbc_tube_interface : public device_slot_card_interface { public: - // construction/destruction - virtual ~device_bbc_tube_interface(); - // reading and writing virtual DECLARE_READ8_MEMBER(host_r) { return 0xfe; } virtual DECLARE_WRITE8_MEMBER(host_w) { } @@ -118,6 +105,7 @@ DECLARE_DEVICE_TYPE(BBC_TUBE_SLOT, bbc_tube_slot_device) void bbc_extube_devices(device_slot_interface &device); void bbc_intube_devices(device_slot_interface &device); +void electron_tube_devices(device_slot_interface &device); //void bbc_x25tube_devices(device_slot_interface &device); diff --git a/src/devices/bus/bbc/tube/tube_6502.cpp b/src/devices/bus/bbc/tube/tube_6502.cpp index beecb3a3019..3aa3c6a1175 100644 --- a/src/devices/bus/bbc/tube/tube_6502.cpp +++ b/src/devices/bus/bbc/tube/tube_6502.cpp @@ -43,21 +43,22 @@ ROM_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(bbc_tube_6502_device::device_add_mconfig) - MCFG_DEVICE_ADD("m6502", M65C02, XTAL(12'000'000) / 4) - MCFG_DEVICE_PROGRAM_MAP(tube_6502_mem) +void bbc_tube_6502_device::device_add_mconfig(machine_config &config) +{ + M65C02(config, m_m6502, 12_MHz_XTAL / 4); + m_m6502->set_addrmap(AS_PROGRAM, &bbc_tube_6502_device::tube_6502_mem); - MCFG_TUBE_ADD("ula") - MCFG_TUBE_PNMI_HANDLER(INPUTLINE("m6502", M65C02_NMI_LINE)) - MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("m6502", M65C02_IRQ_LINE)) + TUBE(config, m_ula); + m_ula->pnmi_handler().set_inputline(m_m6502, M65C02_NMI_LINE); + m_ula->pirq_handler().set_inputline(m_m6502, M65C02_IRQ_LINE); /* internal ram */ - RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0); + RAM(config, m_ram).set_default_size("64K").set_default_value(0); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_ls_6502", "bbc_flop_6502") - MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop_ls_6502").set_original("bbc_flop_6502"); + SOFTWARE_LIST(config, "flop_ls_65c102").set_original("bbc_flop_65c102"); +} //------------------------------------------------- // rom_region - device-specific ROM region diff --git a/src/devices/bus/bbc/tube/tube_65c102.cpp b/src/devices/bus/bbc/tube/tube_65c102.cpp index 56668f8c830..1ef92732526 100644 --- a/src/devices/bus/bbc/tube/tube_65c102.cpp +++ b/src/devices/bus/bbc/tube/tube_65c102.cpp @@ -43,21 +43,22 @@ ROM_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(bbc_tube_65c102_device::device_add_mconfig) - MCFG_DEVICE_ADD("maincpu", M65C02, XTAL(16'000'000) / 4) - MCFG_DEVICE_PROGRAM_MAP(tube_6502_mem) +void bbc_tube_65c102_device::device_add_mconfig(machine_config &config) +{ + M65C02(config, m_maincpu, 16_MHz_XTAL / 4); + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_65c102_device::tube_6502_mem); - MCFG_TUBE_ADD("ula") - MCFG_TUBE_PNMI_HANDLER(INPUTLINE("maincpu", M65C02_NMI_LINE)) - MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("maincpu", M65C02_IRQ_LINE)) + TUBE(config, m_ula); + m_ula->pnmi_handler().set_inputline(m_maincpu, M65C02_NMI_LINE); + m_ula->pirq_handler().set_inputline(m_maincpu, M65C02_IRQ_LINE); /* internal ram */ - RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0); + RAM(config, m_ram).set_default_size("64K").set_default_value(0); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_ls_6502", "bbc_flop_6502") - MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop_ls_6502").set_original("bbc_flop_6502"); + SOFTWARE_LIST(config, "flop_ls_65c102").set_original("bbc_flop_65c102"); +} //------------------------------------------------- // rom_region - device-specific ROM region diff --git a/src/devices/bus/bbc/tube/tube_80286.cpp b/src/devices/bus/bbc/tube/tube_80286.cpp index bf0bc1404ca..f38761341f5 100644 --- a/src/devices/bus/bbc/tube/tube_80286.cpp +++ b/src/devices/bus/bbc/tube/tube_80286.cpp @@ -47,7 +47,7 @@ void bbc_tube_80286_device::tube_80286_io(address_map &map) // ROM( tube_80286 ) //------------------------------------------------- -ROM_START( tube_80286 ) +ROM_START(tube_80286) ROM_REGION(0x4000, "bootstrap", 0) ROM_LOAD16_BYTE("m512_lo.ic31", 0x0000, 0x2000, CRC(c0df8707) SHA1(7f6d843d5aea6bdb36cbd4623ae942b16b96069d)) // 2201,287-02 ROM_LOAD16_BYTE("m512_hi.ic32", 0x0001, 0x2000, CRC(e47f10b2) SHA1(45dc8d7e7936afbec6de423569d9005a1c350316)) // 2201,288-02 @@ -57,22 +57,23 @@ ROM_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(bbc_tube_80286_device::device_add_mconfig) - MCFG_DEVICE_ADD("i80286", I80286, XTAL(12'000'000) / 2) - MCFG_DEVICE_PROGRAM_MAP(tube_80286_mem) - MCFG_DEVICE_IO_MAP(tube_80286_io) - MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(DEVICE_SELF, bbc_tube_80286_device, irq_callback) +void bbc_tube_80286_device::device_add_mconfig(machine_config &config) +{ + I80286(config, m_i80286, 12_MHz_XTAL / 2); + m_i80286->set_addrmap(AS_PROGRAM, &bbc_tube_80286_device::tube_80286_mem); + m_i80286->set_addrmap(AS_IO, &bbc_tube_80286_device::tube_80286_io); + m_i80286->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(bbc_tube_80286_device::irq_callback), this)); - MCFG_TUBE_ADD("ula") - MCFG_TUBE_PNMI_HANDLER(INPUTLINE("i80286", INPUT_LINE_NMI)) - MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("i80286", INPUT_LINE_INT0)) + TUBE(config, m_ula); + m_ula->pnmi_handler().set_inputline(m_i80286, INPUT_LINE_NMI); + m_ula->pirq_handler().set_inputline(m_i80286, INPUT_LINE_INT0); /* internal ram */ - RAM(config, RAM_TAG).set_default_size("1M"); + RAM(config, m_ram).set_default_size("1M"); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_ls_80186", "bbc_flop_80186") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop_ls_80186").set_original("bbc_flop_80186"); +} //------------------------------------------------- // rom_region - device-specific ROM region @@ -117,6 +118,10 @@ void bbc_tube_80286_device::device_start() void bbc_tube_80286_device::device_reset() { m_ula->reset(); + + address_space &program = m_i80286->space(AS_PROGRAM); + + program.install_rom(0xc0000, 0xc3fff, 0x3c000, m_bootstrap->base()); } diff --git a/src/devices/bus/bbc/tube/tube_arm.cpp b/src/devices/bus/bbc/tube/tube_arm.cpp index 27879f79119..444e188a657 100644 --- a/src/devices/bus/bbc/tube/tube_arm.cpp +++ b/src/devices/bus/bbc/tube/tube_arm.cpp @@ -27,6 +27,7 @@ void bbc_tube_arm_device::tube_arm_mem(address_map &map) { map.unmap_value_high(); map(0x0000000, 0x03fffff).rw(FUNC(bbc_tube_arm_device::ram_r), FUNC(bbc_tube_arm_device::ram_w)); + map(0x0400000, 0x0ffffff).noprw(); map(0x1000000, 0x100001f).rw("ula", FUNC(tube_device::parasite_r), FUNC(tube_device::parasite_w)).umask32(0x000000ff); map(0x3000000, 0x3003fff).rom().region("bootstrap", 0).mirror(0xc000); } @@ -50,21 +51,22 @@ ROM_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(bbc_tube_arm_device::device_add_mconfig) - MCFG_DEVICE_ADD("arm", ARM, XTAL(20'000'000) / 3) - MCFG_DEVICE_PROGRAM_MAP(tube_arm_mem) +void bbc_tube_arm_device::device_add_mconfig(machine_config &config) +{ + ARM(config, m_arm, 20_MHz_XTAL / 3); + m_arm->set_addrmap(AS_PROGRAM, &bbc_tube_arm_device::tube_arm_mem); - MCFG_TUBE_ADD("ula") - MCFG_TUBE_HIRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_tube_slot_device, irq_w)) - MCFG_TUBE_PNMI_HANDLER(INPUTLINE("arm", ARM_FIRQ_LINE)) - MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("arm", ARM_IRQ_LINE)) + TUBE(config, m_ula); + m_ula->hirq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_tube_slot_device::irq_w)); + m_ula->pnmi_handler().set_inputline(m_arm, ARM_FIRQ_LINE); + m_ula->pirq_handler().set_inputline(m_arm, ARM_IRQ_LINE); /* internal ram */ - RAM(config, RAM_TAG).set_default_size("4M").set_default_value(0); + RAM(config, m_ram).set_default_size("4M").set_default_value(0); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_ls_arm", "bbc_flop_arm") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop_ls_arm").set_original("bbc_flop_arm"); +} //------------------------------------------------- // rom_region - device-specific ROM region diff --git a/src/devices/bus/bbc/tube/tube_z80.cpp b/src/devices/bus/bbc/tube/tube_z80.cpp index b759fe05898..cc6f87527bf 100644 --- a/src/devices/bus/bbc/tube/tube_z80.cpp +++ b/src/devices/bus/bbc/tube/tube_z80.cpp @@ -61,24 +61,25 @@ ROM_END // device_add_mconfig - add device configuration //------------------------------------------------- -MACHINE_CONFIG_START(bbc_tube_z80_device::device_add_mconfig) - MCFG_DEVICE_ADD("z80", Z80, XTAL(12'000'000) / 2) - MCFG_DEVICE_PROGRAM_MAP(tube_z80_mem) - MCFG_DEVICE_OPCODES_MAP(tube_z80_fetch) - MCFG_DEVICE_IO_MAP(tube_z80_io) - MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(DEVICE_SELF, bbc_tube_z80_device, irq_callback) - - MCFG_TUBE_ADD("ula") - MCFG_TUBE_HIRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_tube_slot_device, irq_w)) - MCFG_TUBE_PNMI_HANDLER(WRITELINE(*this, bbc_tube_z80_device, nmi_w)) - MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("z80", INPUT_LINE_IRQ0)) +void bbc_tube_z80_device::device_add_mconfig(machine_config &config) +{ + Z80(config, m_z80, 12_MHz_XTAL / 2); + m_z80->set_addrmap(AS_PROGRAM, &bbc_tube_z80_device::tube_z80_mem); + m_z80->set_addrmap(AS_OPCODES, &bbc_tube_z80_device::tube_z80_fetch); + m_z80->set_addrmap(AS_IO, &bbc_tube_z80_device::tube_z80_io); + m_z80->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(bbc_tube_z80_device::irq_callback), this)); + + TUBE(config, m_ula); + m_ula->hirq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_tube_slot_device::irq_w)); + m_ula->pnmi_handler().set(FUNC(bbc_tube_z80_device::nmi_w)); + m_ula->pirq_handler().set_inputline(m_z80, INPUT_LINE_IRQ0); /* internal ram */ - RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0); + RAM(config, m_ram).set_default_size("64K").set_default_value(0); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_flop_z80") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop_ls_z80").set_original("bbc_flop_z80"); +} //------------------------------------------------- // rom_region - device-specific ROM region diff --git a/src/devices/bus/bbc/userport/userport.h b/src/devices/bus/bbc/userport/userport.h index 22003968ee9..e2807146efe 100644 --- a/src/devices/bus/bbc/userport/userport.h +++ b/src/devices/bus/bbc/userport/userport.h @@ -33,20 +33,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_BBC_USERPORT_SLOT_ADD(_tag, _slot_intf, _def_slot) \ - MCFG_DEVICE_ADD(_tag, BBC_USERPORT_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) - -#define MCFG_BBC_USERPORT_CB1_HANDLER(_devcb) \ - downcast<bbc_userport_slot_device &>(*device).set_cb1_handler(DEVCB_##_devcb); - -#define MCFG_BBC_USERPORT_CB2_HANDLER(_devcb) \ - downcast<bbc_userport_slot_device &>(*device).set_cb2_handler(DEVCB_##_devcb); - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -59,11 +45,21 @@ class bbc_userport_slot_device : public device_t, public device_slot_interface { public: // construction/destruction - bbc_userport_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + template <typename T> + bbc_userport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option) + : bbc_userport_slot_device(mconfig, tag, owner) + { + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(false); + } + + bbc_userport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); // callbacks - template <class Object> devcb_base &set_cb1_handler(Object &&cb) { return m_cb1_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_cb2_handler(Object &&cb) { return m_cb2_handler.set_callback(std::forward<Object>(cb)); } + auto cb1_handler() { return m_cb1_handler.bind(); } + auto cb2_handler() { return m_cb2_handler.bind(); } DECLARE_WRITE_LINE_MEMBER(cb1_w) { m_cb1_handler(state); } DECLARE_WRITE_LINE_MEMBER(cb2_w) { m_cb2_handler(state); } diff --git a/src/devices/bus/generic/slot.h b/src/devices/bus/generic/slot.h index 6c60a58be0a..d0f76b2ea78 100644 --- a/src/devices/bus/generic/slot.h +++ b/src/devices/bus/generic/slot.h @@ -189,7 +189,17 @@ protected: class generic_socket_device : public generic_slot_device { public: - generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + template <typename T> + generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *intf, const char *exts) + : generic_socket_device(mconfig, tag, owner, (uint32_t)0) + { + opts(*this); + set_fixed(false); + set_interface(intf); + set_extensions(exts); + } + + generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); virtual iodevice_t image_type() const override { return IO_ROM; } }; diff --git a/src/devices/bus/isa/com.cpp b/src/devices/bus/isa/com.cpp index 57393a52500..bd2b500d611 100644 --- a/src/devices/bus/isa/com.cpp +++ b/src/devices/bus/isa/com.cpp @@ -8,18 +8,24 @@ #include "emu.h" #include "com.h" + +#include "bus/rs232/hlemouse.h" +#include "bus/rs232/null_modem.h" #include "bus/rs232/rs232.h" -#include "bus/rs232/ser_mouse.h" +#include "bus/rs232/sun_kbd.h" #include "bus/rs232/terminal.h" -#include "bus/rs232/null_modem.h" #include "machine/ins8250.h" static void isa_com(device_slot_interface &device) { - device.option_add("microsoft_mouse", MSFT_SERIAL_MOUSE); - device.option_add("msystems_mouse", MSYSTEM_SERIAL_MOUSE); + device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE); + device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE); + device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE); + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); + device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE); device.option_add("terminal", SERIAL_TERMINAL); device.option_add("null_modem", NULL_MODEM); + device.option_add("sun_kbd", SUN_KBD_ADAPTOR); } @@ -55,7 +61,7 @@ MACHINE_CONFIG_START(isa8_com_device::device_add_mconfig) uart3.out_rts_callback().set("serport3", FUNC(rs232_port_device::write_rts)); uart3.out_int_callback().set(FUNC(isa8_com_device::pc_com_interrupt_2));*/ - MCFG_DEVICE_ADD( "serport0", RS232_PORT, isa_com, "microsoft_mouse" ) + MCFG_DEVICE_ADD( "serport0", RS232_PORT, isa_com, "logitech_mouse" ) MCFG_RS232_RXD_HANDLER(WRITELINE(uart0, ins8250_uart_device, rx_w)) MCFG_RS232_DCD_HANDLER(WRITELINE(uart0, ins8250_uart_device, dcd_w)) MCFG_RS232_DSR_HANDLER(WRITELINE(uart0, ins8250_uart_device, dsr_w)) @@ -156,7 +162,7 @@ MACHINE_CONFIG_START(isa8_com_at_device::device_add_mconfig) uart3.out_dtr_callback().set("serport3", FUNC(rs232_port_device::write_dtr)); uart3.out_rts_callback().set("serport3", FUNC(rs232_port_device::write_rts)); uart3.out_int_callback().set(FUNC(isa8_com_device::pc_com_interrupt_2));*/ - MCFG_DEVICE_ADD( "serport0", RS232_PORT, isa_com, "microsoft_mouse" ) + MCFG_DEVICE_ADD( "serport0", RS232_PORT, isa_com, "logitech_mouse" ) MCFG_RS232_RXD_HANDLER(WRITELINE(uart0, ins8250_uart_device, rx_w)) MCFG_RS232_DCD_HANDLER(WRITELINE(uart0, ins8250_uart_device, dcd_w)) MCFG_RS232_DSR_HANDLER(WRITELINE(uart0, ins8250_uart_device, dsr_w)) diff --git a/src/devices/bus/isa/myb3k_com.cpp b/src/devices/bus/isa/myb3k_com.cpp index fdc0a527c6f..df0ce634ea7 100644 --- a/src/devices/bus/isa/myb3k_com.cpp +++ b/src/devices/bus/isa/myb3k_com.cpp @@ -101,12 +101,9 @@ void isa8_myb3k_com_device::device_reset() { // IO base factory setting is 0x540 uint32_t base = m_iobase->read(); - m_isa->install_device(base, base, - read8_delegate(FUNC(i8251_device::data_r), subdevice<i8251_device>("usart")), - write8_delegate(FUNC(i8251_device::data_w), subdevice<i8251_device>("usart")) ); - m_isa->install_device(base + 1, base + 1, - read8_delegate(FUNC(i8251_device::status_r), subdevice<i8251_device>("usart")), - write8_delegate(FUNC(i8251_device::control_w), subdevice<i8251_device>("usart")) ); + m_isa->install_device(base, base + 1, + read8sm_delegate(FUNC(i8251_device::read), m_usart.target()), + write8sm_delegate(FUNC(i8251_device::write), m_usart.target()) ); m_isa->install_device(base + 2, base + 2, read8_delegate(FUNC(isa8_myb3k_com_device::dce_status), this), diff --git a/src/devices/bus/isa/p1_sound.cpp b/src/devices/bus/isa/p1_sound.cpp index 62b0bbca1d6..15fa04af149 100644 --- a/src/devices/bus/isa/p1_sound.cpp +++ b/src/devices/bus/isa/p1_sound.cpp @@ -165,11 +165,11 @@ void p1_sound_device::device_start() write8_delegate(FUNC(p1_sound_device::dac_w), this)); m_isa->install_memory(0xee000, 0xee000, - read8_delegate(FUNC(i8251_device::data_r), (i8251_device*)m_midi), - write8_delegate(FUNC(i8251_device::data_w), (i8251_device*)m_midi)); + read8smo_delegate(FUNC(i8251_device::data_r), m_midi.target()), + write8smo_delegate(FUNC(i8251_device::data_w), m_midi.target())); m_isa->install_memory(0xee002, 0xee002, - read8_delegate(FUNC(i8251_device::status_r), (i8251_device*)m_midi), - write8_delegate(FUNC(i8251_device::control_w), (i8251_device*)m_midi)); + read8smo_delegate(FUNC(i8251_device::status_r), m_midi.target()), + write8smo_delegate(FUNC(i8251_device::control_w), m_midi.target())); // sync generator m_isa->install_memory(0xef000, 0xef007, diff --git a/src/devices/bus/rs232/hlemouse.cpp b/src/devices/bus/rs232/hlemouse.cpp new file mode 100644 index 00000000000..713f6adefa5 --- /dev/null +++ b/src/devices/bus/rs232/hlemouse.cpp @@ -0,0 +1,691 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/************************************************************************** + + PC Serial Mouse Simulation + + Microsoft mouse is the classic two-button PC mouse. Data is 7N1 at + 1,200 Baud. Mouse can be reset by de-asserting RTS. On start, the + mouse identifies itself with the string "M". Bit 6 is only set for + the first byte of a report - it's clear for all subsequent bytes of + a report, and also for all identification bytes. + + Reports consist of three bytes: the first byte contains the button + state and the two high bits of the Y and X delta; the second byte + contains the low six bits of the X delta; the third byte contains + the low six bits of the Y delta. Button bits are set when pressed, + and positive delta is rightwards/downwards. + + 1lryyxx 0xxxxxx 0yyyyyy + + Logitech extended the Microsoft protocol to support a third button. + The mouse identifies itself with the string "M3". If the third + button changes state, and additional byte is sent indicating the + new state of the third button. + + 1lryyxx 0xxxxxx 0yyyyyy 0m00000 + + The serial wheel mouse protocol extends the Microsoft mouse protocol + in a different way. The mouse identifies itself with the string + "MZ@\0\0\0". If the third button or wheel state changes, a fourth + an additional byte is sent containing the third button state and a + four-bit wheel delta value. The wheel value is positive for + downward movement. Note that the third button is value is in a + different position to the logitech protocol. + + 1lryyxx 0xxxxxx 0yyyyyy 00mwwww + + The Mouse Systems non-rotatable protocol provides two-axis movement + and three buttons. Data is 8N1 at 1,200 Baud (the M-1 mouse could + also be configured for 300 Baud by turning DIP switch 1 off). The + mouse does not send an identification string. The first byte of a + report can be identified by a fixed pattern in the five most + significant bits. + + Reports are five bytes long. The first byte contains the the button + state; the second and fourth bytes contain X delta; the third and + fifth bytes contain Y delta. The two delta values for each axis + should be summed. Delta values range from -120 to 127 to prevent + being mistaken for the lead byte of a report. Button bits are clear + when set, and positive delta is rightwards/upwards. Delta values + are generated immediately before transmission - reports are not + atomic. + + 10000lmr xxxxxxxx yyyyyyyy xxxxxxxx yyyyyyyy + + The Mouse systems rotatable protcol allows the host to infer + rotation around the third axis at the cost of halving the maximum + sustained movement speed. The M-1 mouse has two sensors spaced 100 + counts apart horizontally. If DIP switch 2 is on, the X and Y delta + for each sensor is reported separately. The right sensor delta is + reported before the left sensor delta. If the mouse is rotated, the + delta values for the two sensors will differ. + +**************************************************************************/ + +#include "emu.h" +#include "hlemouse.h" + +#include <cassert> +#include <cmath> + + +//************************************************** +// Device type globals +//************************************************** + +DEFINE_DEVICE_TYPE_NS(MSFT_HLE_SERIAL_MOUSE, bus::rs232, hle_msft_mouse_device, "rs232_mouse_hle_msft", "Microsoft 2-Button Serial Mouse (HLE)") +DEFINE_DEVICE_TYPE_NS(LOGITECH_HLE_SERIAL_MOUSE, bus::rs232, hle_logitech_mouse_device, "rs232_mouse_hle_logitech", "Logitech 3-Button Serial Mouse (HLE)") +DEFINE_DEVICE_TYPE_NS(WHEEL_HLE_SERIAL_MOUSE, bus::rs232, hle_wheel_mouse_device, "rs232_mouse_hle_wheel", "Microsoft Serial Mouse with Wheel (HLE)") +DEFINE_DEVICE_TYPE_NS(MSYSTEMS_HLE_SERIAL_MOUSE, bus::rs232, hle_msystems_mouse_device, "rs232_mouse_hle_msystems", "Mouse Systems Non-rotatable Mouse (HLE)") +DEFINE_DEVICE_TYPE_NS(ROTATABLE_HLE_SERIAL_MOUSE, bus::rs232, hle_rotatable_mouse_device, "rs232_mouse_hle_rotatable", "Mouse Systems Rotatable Mouse (HLE)") + +namespace bus { namespace rs232 { + +namespace { + +INPUT_PORTS_START(msft) + PORT_START("BTN") + PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr) + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr) + + PORT_START("X") + PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr) + + PORT_START("Y") + PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr) +INPUT_PORTS_END + + +INPUT_PORTS_START(logitech) + PORT_INCLUDE(msft) + + PORT_MODIFY("BTN") + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr) + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr) +INPUT_PORTS_END + + +INPUT_PORTS_START(wheel) + PORT_INCLUDE(logitech) + + PORT_START("WHEEL") + PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0fff, 0x00, IPT_DIAL_V ) PORT_SENSITIVITY(10) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr) +INPUT_PORTS_END + + +INPUT_PORTS_START(msystems) + PORT_START("BTN") + PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr) + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr) + + PORT_START("X") + PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr) + + PORT_START("Y") + PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr) +INPUT_PORTS_END + + +INPUT_PORTS_START(rotatable) + PORT_INCLUDE(msystems) + + PORT_START("ROT") + PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0fff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(10) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr) +INPUT_PORTS_END + + +template <unsigned Bits, typename T> +std::make_signed_t<T> read_axis(ioport_port &port, T &val) +{ + static_assert((1U < Bits) && ((sizeof(T) * 8) > Bits), "invalid field bits"); + + T const updated(T(std::make_unsigned_t<T>(port.read())) & make_bitmask<T>(Bits)); + std::make_signed_t<T> delta(std::make_signed_t<T>(updated) - std::make_signed_t<T>(val)); + if (std::make_signed_t<T>(std::make_unsigned_t<T>(1) << (Bits - 1)) <= delta) + delta -= std::make_signed_t<T>(std::make_unsigned_t<T>(1) << Bits); + else if (-std::make_signed_t<T>(std::make_unsigned_t<T>(1) << (Bits - 1)) >= delta) + delta += std::make_signed_t<T>(std::make_unsigned_t<T>(1) << Bits); + val = updated; + return delta; +} + + +template <typename T> +uint8_t report_axis(T &delta, T low, T high) +{ + T const result(std::min<T>(std::max<T>(delta, low), high)); + delta -= result; + return uint8_t(int8_t(result)); +} + +} // anonymous namespace + + +//************************************************** +// Microsoft mouse base +//************************************************** + +INPUT_CHANGED_MEMBER(hle_msmouse_device_base::input_changed) +{ + if (fifo_empty() && is_transmit_register_empty()) + check_inputs(); +} + +hle_msmouse_device_base::hle_msmouse_device_base( + machine_config const &mconfig, + device_type type, + char const *tag, + device_t *owner, + uint32_t clock) + : buffered_rs232_device<8>(mconfig, type, tag, owner, clock) + , m_buttons(*this, "BTN") + , m_x_axis(*this, "X") + , m_y_axis(*this, "Y") + , m_x_delta(0) + , m_y_delta(0) + , m_x_val(0U) + , m_y_val(0U) + , m_btn_val(0x00U) + , m_btn_sent(0x00U) + , m_dtr(0U) + , m_rts(0U) + , m_enable(0U) +{ +} + +void hle_msmouse_device_base::device_resolve_objects() +{ + buffered_rs232_device<8>::device_resolve_objects(); + + m_dtr = 0U; + m_rts = 0U; +} + +void hle_msmouse_device_base::device_start() +{ + buffered_rs232_device<8>::device_start(); + + save_item(NAME(m_x_delta)); + save_item(NAME(m_y_delta)); + save_item(NAME(m_x_val)); + save_item(NAME(m_y_val)); + save_item(NAME(m_btn_val)); + save_item(NAME(m_btn_sent)); + save_item(NAME(m_dtr)); + save_item(NAME(m_rts)); + save_item(NAME(m_enable)); + + set_data_frame(1, 7, PARITY_NONE, STOP_BITS_2); + set_rate(1'200); + receive_register_reset(); + transmit_register_reset(); + + m_x_delta = m_y_delta = 0; + m_x_val = m_y_val = 0U; + m_btn_val = m_btn_sent = 0x00U; + m_enable = 0U; + + machine().scheduler().synchronize(timer_expired_delegate(FUNC(hle_msmouse_device_base::start_mouse), this)); +} + +WRITE_LINE_MEMBER(hle_msmouse_device_base::input_dtr) +{ + m_dtr = state ? 1U : 0U; + check_enable(); +} + +WRITE_LINE_MEMBER(hle_msmouse_device_base::input_rts) +{ + m_dtr = state ? 1U : 0U; + check_enable(); +} + +void hle_msmouse_device_base::tra_complete() +{ + buffered_rs232_device<8>::tra_complete(); + if (fifo_empty() && is_transmit_register_empty()) + check_inputs(); +} + +void hle_msmouse_device_base::received_byte(u8 byte) +{ +} + + +TIMER_CALLBACK_MEMBER(hle_msmouse_device_base::start_mouse) +{ + check_enable(); +} + +void hle_msmouse_device_base::check_enable() +{ + bool const enable(!m_dtr && !m_rts); + if (bool(m_enable) != enable) + { + m_enable = enable ? 1U : 0U; + clear_fifo(); + receive_register_reset(); + transmit_register_reset(); + if (enable) + { + read_inputs(); + m_x_delta = m_y_delta = 0; + m_btn_sent = m_btn_val; + reset_and_identify(); + } + } +} + +void hle_msmouse_device_base::check_inputs() +{ + if (m_enable && read_inputs()) + { + uint8_t const x(report_axis<int16_t>(m_x_delta, -128, 127)); + uint8_t const y(report_axis<int16_t>(m_y_delta, -128, 127)); + transmit_byte(0x40U | ((m_btn_val << 4) & 0x30U) | ((y >> 4) & 0x0cU) | ((x >> 6) & 0x03U)); + transmit_byte(x & 0x3fU); + transmit_byte(y & 0x3fU); + transmit_extensions(m_btn_val, m_btn_sent); + m_btn_sent = m_btn_val; + } +} + +bool hle_msmouse_device_base::read_inputs() +{ + m_x_delta += read_axis<12>(*m_x_axis, m_x_val); + m_y_delta += read_axis<12>(*m_y_axis, m_y_val); + m_btn_val = m_buttons->read(); + return m_x_delta || m_y_delta || (m_btn_val != m_btn_sent); +} + + +//************************************************** +// Microsoft 2-button mouse +//************************************************** + +hle_msft_mouse_device::hle_msft_mouse_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock) + : hle_msmouse_device_base(mconfig, MSFT_HLE_SERIAL_MOUSE, tag, owner, clock) +{ +} + +ioport_constructor hle_msft_mouse_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(msft); +} + +void hle_msft_mouse_device::reset_and_identify() +{ + // assume ASCII host system + transmit_byte('M'); +} + +void hle_msft_mouse_device::transmit_extensions(uint8_t btn_val, uint8_t btn_sent) +{ +} + + +//************************************************** +// Logitech 3-button mouse +//************************************************** + +hle_logitech_mouse_device::hle_logitech_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) + : hle_msmouse_device_base(mconfig, LOGITECH_HLE_SERIAL_MOUSE, tag, owner, clock) +{ +} + +ioport_constructor hle_logitech_mouse_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(logitech); +} + +void hle_logitech_mouse_device::reset_and_identify() +{ + // assume ASCII host system + transmit_byte('M'); + transmit_byte('3'); +} + +void hle_logitech_mouse_device::transmit_extensions(uint8_t btn_val, uint8_t btn_sent) +{ + if (BIT(btn_val | btn_sent, 2)) + transmit_byte(BIT(btn_val, 2) << 5); +} + + + +//************************************************** +// Microsoft wheel mouse +//************************************************** + +hle_wheel_mouse_device::hle_wheel_mouse_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock) + : hle_msmouse_device_base(mconfig, WHEEL_HLE_SERIAL_MOUSE, tag, owner, clock) + , m_wheel(*this, "WHEEL") + , m_wheel_delta(0) + , m_wheel_val(0U) +{ +} + +ioport_constructor hle_wheel_mouse_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(wheel); +} + +void hle_wheel_mouse_device::device_start() +{ + hle_msmouse_device_base::device_start(); + + save_item(NAME(m_wheel_delta)); + save_item(NAME(m_wheel_val)); + + m_wheel_delta = 0; + m_wheel_val = 0U; +} + +bool hle_wheel_mouse_device::read_inputs() +{ + m_wheel_delta += read_axis<12>(*m_wheel, m_wheel_val); + return hle_msmouse_device_base::read_inputs() || m_wheel_delta; +} + +void hle_wheel_mouse_device::reset_and_identify() +{ + m_wheel_delta = 0; + + // assume ASCII host system + transmit_byte('M'); + transmit_byte('Z'); + transmit_byte('@'); + transmit_byte('\0'); + transmit_byte('\0'); + transmit_byte('\0'); +} + +void hle_wheel_mouse_device::transmit_extensions(uint8_t btn_val, uint8_t btn_sent) +{ + if (BIT(btn_val | btn_sent, 2) || m_wheel_delta) + transmit_byte((BIT(btn_val, 2) << 4) | (report_axis<int16_t>(m_wheel_delta, -8, 7) & 0x0fU)); +} + + +//************************************************** +// Mouse Systems mouse base +//************************************************** + +INPUT_CHANGED_MEMBER(hle_msystems_device_base::input_changed) +{ + if (is_transmit_register_empty()) + { + assert(0U == m_phase); + tra_complete(); + } +} + +hle_msystems_device_base::hle_msystems_device_base( + machine_config const &mconfig, + device_type type, + char const *tag, + device_t *owner, + uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , device_rs232_port_interface(mconfig, *this) + , device_serial_interface(mconfig, *this) + , m_phase(0U) +{ +} + +void hle_msystems_device_base::device_start() +{ + save_item(NAME(m_phase)); + + set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1); + set_rate(1'200); + receive_register_reset(); + transmit_register_reset(); + + m_phase = 0U; + + machine().scheduler().synchronize(timer_expired_delegate(FUNC(hle_msystems_device_base::start_mouse), this)); +} + +void hle_msystems_device_base::tra_callback() +{ + output_rxd(transmit_register_get_data_bit()); +} + +void hle_msystems_device_base::tra_complete() +{ + if (4U <= m_phase) + m_phase = 0U; + else + ++m_phase; + + bool const dirty(read_inputs()); + switch (m_phase) + { + case 0U: + if (dirty) + transmit_register_setup((report_buttons() & 0x07U) | 0x80U); + break; + case 1U: + transmit_register_setup(report_x1_delta()); + break; + case 2U: + transmit_register_setup(report_y1_delta()); + break; + case 3U: + transmit_register_setup(report_x2_delta()); + break; + case 4U: + transmit_register_setup(report_y2_delta()); + break; + }; +} + +TIMER_CALLBACK_MEMBER(hle_msystems_device_base::start_mouse) +{ + if (is_transmit_register_empty()) + { + assert(0U == m_phase); + tra_complete(); + } +} + + +//************************************************** +// Mouse Systems non-rotatable mouse +//************************************************** + +hle_msystems_mouse_device::hle_msystems_mouse_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock) + : hle_msystems_device_base(mconfig, MSYSTEMS_HLE_SERIAL_MOUSE, tag, owner, clock) + , m_buttons(*this, "BTN") + , m_x_axis(*this, "X") + , m_y_axis(*this, "Y") + , m_x_delta(0) + , m_y_delta(0) + , m_x_val(0U) + , m_y_val(0U) + , m_btn_val(0x00U) + , m_btn_sent(0x00U) +{ +} + +ioport_constructor hle_msystems_mouse_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(msystems); +} + +void hle_msystems_mouse_device::device_start() +{ + hle_msystems_device_base::device_start(); + + save_item(NAME(m_x_delta)); + save_item(NAME(m_y_delta)); + save_item(NAME(m_x_val)); + save_item(NAME(m_y_val)); + save_item(NAME(m_btn_val)); + save_item(NAME(m_btn_sent)); + + m_x_delta = m_y_delta = 0; + m_x_val = m_y_val = 0U; + m_btn_val = m_btn_sent = 0x00U; +} + +bool hle_msystems_mouse_device::read_inputs() +{ + m_x_delta += read_axis<12>(*m_x_axis, m_x_val); + m_y_delta -= read_axis<12>(*m_y_axis, m_y_val); + m_btn_val = m_buttons->read(); + return m_x_delta || m_y_delta || (m_btn_val != m_btn_sent); +} + +uint8_t hle_msystems_mouse_device::report_buttons() +{ + m_btn_sent = m_btn_val; + return m_btn_sent; +} + +uint8_t hle_msystems_mouse_device::report_x1_delta() +{ + return report_axis<int16_t>(m_x_delta, -120, 127); +} + +uint8_t hle_msystems_mouse_device::report_y1_delta() +{ + return report_axis<int16_t>(m_y_delta, -120, 127); +} + +uint8_t hle_msystems_mouse_device::report_x2_delta() +{ + return report_axis<int16_t>(m_x_delta, -120, 127); +} + +uint8_t hle_msystems_mouse_device::report_y2_delta() +{ + return report_axis<int16_t>(m_y_delta, -120, 127); +} + + +//************************************************** +// Mouse Systems rotatable mouse +//************************************************** + +hle_rotatable_mouse_device::hle_rotatable_mouse_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock) + : hle_msystems_device_base(mconfig, ROTATABLE_HLE_SERIAL_MOUSE, tag, owner, clock) + , m_buttons(*this, "BTN") + , m_x_axis(*this, "X") + , m_y_axis(*this, "Y") + , m_rotation(*this, "ROT") + , m_x_delta{ 0, 0 } + , m_y_delta{ 0, 0 } + , m_x_val(0U) + , m_y_val(0U) + , m_rot_val(0U) + , m_btn_val(0x00U) + , m_btn_sent(0x00U) +{ +} + +ioport_constructor hle_rotatable_mouse_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(rotatable); +} + +void hle_rotatable_mouse_device::device_start() +{ + hle_msystems_device_base::device_start(); + + save_item(NAME(m_x_delta)); + save_item(NAME(m_y_delta)); + save_item(NAME(m_x_val)); + save_item(NAME(m_y_val)); + save_item(NAME(m_rot_val)); + save_item(NAME(m_btn_val)); + save_item(NAME(m_btn_sent)); + + m_x_delta[0] = m_x_delta[1] = m_y_delta[0] = m_y_delta[1] = 0; + m_x_val = m_y_val = m_rot_val = 0U; + m_btn_val = m_btn_sent = 0x00U; +} + +bool hle_rotatable_mouse_device::read_inputs() +{ + // translation is straighforward + int16_t const x_delta(read_axis<12>(*m_x_axis, m_x_val)); + int16_t const y_delta(read_axis<12>(*m_y_axis, m_y_val)); + m_x_delta[0] += x_delta; + m_x_delta[1] += x_delta; + m_y_delta[0] -= y_delta; + m_y_delta[1] -= y_delta; + + // there are two sensors 100 counts apart, one inch below the centre of the mouse + // for simplicity, assume the mouse is rotated around the point midway the sensors + int16_t const rot_delta(read_axis<12>(*m_rotation, m_rot_val)); + if (rot_delta) + { + double const rot_angle(-0.15 * rot_delta); + long const x_diff(std::lround((1 - std::cos(rot_angle)) * 100)); + long const y_diff(std::lround(std::sin(rot_angle) * 100)); + m_x_delta[0] -= x_diff / 2; + m_x_delta[1] += x_diff - (x_diff / 2); + m_y_delta[0] += y_diff / 2; + m_y_delta[1] -= y_diff - (y_diff / 2); + } + + // this is straightforward, too + m_btn_val = m_buttons->read(); + return m_x_delta[0] || m_x_delta[1] || m_y_delta[0] || m_y_delta[1] || (m_btn_val != m_btn_sent); +} + +uint8_t hle_rotatable_mouse_device::report_buttons() +{ + m_btn_sent = m_btn_val; + return m_btn_sent; +} + +uint8_t hle_rotatable_mouse_device::report_x1_delta() +{ + return report_axis<int16_t>(m_x_delta[0], -120, 127); +} + +uint8_t hle_rotatable_mouse_device::report_y1_delta() +{ + return report_axis<int16_t>(m_y_delta[0], -120, 127); +} + +uint8_t hle_rotatable_mouse_device::report_x2_delta() +{ + return report_axis<int16_t>(m_x_delta[1], -120, 127); +} + +uint8_t hle_rotatable_mouse_device::report_y2_delta() +{ + return report_axis<int16_t>(m_y_delta[1], -120, 127); +} + +} } // namespace bus::rs232 diff --git a/src/devices/bus/rs232/hlemouse.h b/src/devices/bus/rs232/hlemouse.h new file mode 100644 index 00000000000..be3142ad118 --- /dev/null +++ b/src/devices/bus/rs232/hlemouse.h @@ -0,0 +1,221 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/************************************************************************** + + PC Serial Mouse Simulation + +**************************************************************************/ +#ifndef MAME_BUS_RS232_HLEMOUSE_H +#define MAME_BUS_RS232_HLEMOUSE_H + +#pragma once + +#include "rs232.h" +#include "diserial.h" + +#include <type_traits> + + +namespace bus { namespace rs232 { + +//************************************************** +// Microsoft mouse base +//************************************************** + +class hle_msmouse_device_base : public buffered_rs232_device<8> +{ +public: + DECLARE_INPUT_CHANGED_MEMBER(input_changed); + +protected: + hle_msmouse_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock); + + virtual void device_resolve_objects() override; + virtual void device_start() override; + + virtual DECLARE_WRITE_LINE_MEMBER(input_dtr) override; + virtual DECLARE_WRITE_LINE_MEMBER(input_rts) override; + + virtual void tra_complete() override; + + virtual void received_byte(u8 byte) override; + + virtual bool read_inputs(); + +private: + TIMER_CALLBACK_MEMBER(start_mouse); + void check_enable(); + void check_inputs(); + + virtual void reset_and_identify() = 0; + virtual void transmit_extensions(uint8_t btn_val, uint8_t btn_sent) = 0; + + required_ioport m_buttons, m_x_axis, m_y_axis; + int16_t m_x_delta, m_y_delta; + uint16_t m_x_val, m_y_val; + uint8_t m_btn_val, m_btn_sent; + uint8_t m_dtr, m_rts, m_enable; +}; + + +//************************************************** +// Microsoft 2-button mouse +//************************************************** + +class hle_msft_mouse_device : public hle_msmouse_device_base +{ +public: + hle_msft_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); + +protected: + virtual ioport_constructor device_input_ports() const override; + +private: + virtual void reset_and_identify() override; + virtual void transmit_extensions(uint8_t btn_val, uint8_t btn_sent) override; +}; + + +//************************************************** +// Logitech 3-button mouse +//************************************************** + +class hle_logitech_mouse_device : public hle_msmouse_device_base +{ +public: + hle_logitech_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); + +protected: + virtual ioport_constructor device_input_ports() const override; + +private: + virtual void reset_and_identify() override; + virtual void transmit_extensions(uint8_t btn_val, uint8_t btn_sent) override; +}; + + +//************************************************** +// Microsoft wheel mouse +//************************************************** + +class hle_wheel_mouse_device : public hle_msmouse_device_base +{ +public: + hle_wheel_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); + +protected: + virtual ioport_constructor device_input_ports() const override; + virtual void device_start() override; + + virtual bool read_inputs() override; + +private: + virtual void reset_and_identify() override; + virtual void transmit_extensions(uint8_t btn_val, uint8_t btn_sent) override; + + required_ioport m_wheel; + int16_t m_wheel_delta; + uint16_t m_wheel_val; +}; + + +//************************************************** +// Mouse Systems mouse base +//************************************************** + +class hle_msystems_device_base : public device_t, public device_rs232_port_interface, public device_serial_interface +{ +public: + DECLARE_INPUT_CHANGED_MEMBER(input_changed); + +protected: + hle_msystems_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock); + + virtual void device_start() override; + + virtual void tra_callback() override; + virtual void tra_complete() override; + +private: + TIMER_CALLBACK_MEMBER(start_mouse); + + virtual bool read_inputs() = 0; + virtual uint8_t report_buttons() = 0; + virtual uint8_t report_x1_delta() = 0; + virtual uint8_t report_y1_delta() = 0; + virtual uint8_t report_x2_delta() = 0; + virtual uint8_t report_y2_delta() = 0; + + uint8_t m_phase; +}; + + +//************************************************** +// Mouse Systems non-rotatable mouse +//************************************************** + +class hle_msystems_mouse_device : public hle_msystems_device_base +{ +public: + hle_msystems_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); + +protected: + virtual ioport_constructor device_input_ports() const override; + virtual void device_start() override; + +private: + virtual bool read_inputs() override; + virtual uint8_t report_buttons() override; + virtual uint8_t report_x1_delta() override; + virtual uint8_t report_y1_delta() override; + virtual uint8_t report_x2_delta() override; + virtual uint8_t report_y2_delta() override; + + required_ioport m_buttons, m_x_axis, m_y_axis; + int16_t m_x_delta, m_y_delta; + uint16_t m_x_val, m_y_val; + uint8_t m_btn_val, m_btn_sent; +}; + + +//************************************************** +// Mouse Systems rotatable mouse +//************************************************** + +class hle_rotatable_mouse_device : public hle_msystems_device_base +{ +public: + hle_rotatable_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); + +protected: + virtual ioport_constructor device_input_ports() const override; + virtual void device_start() override; + +private: + virtual bool read_inputs() override; + virtual uint8_t report_buttons() override; + virtual uint8_t report_x1_delta() override; + virtual uint8_t report_y1_delta() override; + virtual uint8_t report_x2_delta() override; + virtual uint8_t report_y2_delta() override; + + required_ioport m_buttons, m_x_axis, m_y_axis, m_rotation; + int16_t m_x_delta[2], m_y_delta[2]; + uint16_t m_x_val, m_y_val, m_rot_val; + uint8_t m_btn_val, m_btn_sent; +}; + +} } // namespace bus::rs232 + + +//************************************************** +// Device type globals +//************************************************** + +DECLARE_DEVICE_TYPE_NS(MSFT_HLE_SERIAL_MOUSE, bus::rs232, hle_msft_mouse_device) +DECLARE_DEVICE_TYPE_NS(LOGITECH_HLE_SERIAL_MOUSE, bus::rs232, hle_logitech_mouse_device) +DECLARE_DEVICE_TYPE_NS(WHEEL_HLE_SERIAL_MOUSE, bus::rs232, hle_wheel_mouse_device) +DECLARE_DEVICE_TYPE_NS(MSYSTEMS_HLE_SERIAL_MOUSE, bus::rs232, hle_msystems_mouse_device) +DECLARE_DEVICE_TYPE_NS(ROTATABLE_HLE_SERIAL_MOUSE, bus::rs232, hle_rotatable_mouse_device) + +#endif // MAME_BUS_RS232_SER_MOUSE_H diff --git a/src/devices/bus/rs232/ser_mouse.cpp b/src/devices/bus/rs232/ser_mouse.cpp deleted file mode 100644 index 2c80fc43ef5..00000000000 --- a/src/devices/bus/rs232/ser_mouse.cpp +++ /dev/null @@ -1,267 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:smf -/*************************************************************************** - - machine/ser_mouse.c - - Code for emulating PC-style serial mouses - -***************************************************************************/ - -#include "emu.h" -#include "ser_mouse.h" - - -serial_mouse_device::serial_mouse_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, type, tag, owner, clock), - device_rs232_port_interface(mconfig, *this), - device_serial_interface(mconfig, *this), - m_dtr(1), - m_rts(1), - m_head(0), - m_tail(0), - m_mb(0), - m_timer(nullptr), - m_enabled(false), - m_x(*this, "ser_mouse_x"), - m_y(*this, "ser_mouse_y"), - m_btn(*this, "ser_mouse_btn") -{ -} - -DEFINE_DEVICE_TYPE(MSFT_SERIAL_MOUSE, microsoft_mouse_device, "microsoft_mouse", "Microsoft Serial Mouse") - -microsoft_mouse_device::microsoft_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : serial_mouse_device(mconfig, MSFT_SERIAL_MOUSE, tag, owner, clock) -{ -} - -DEFINE_DEVICE_TYPE(MSYSTEM_SERIAL_MOUSE, mouse_systems_mouse_device, "mouse_systems_mouse", "Mouse Systems Serial Mouse") - -mouse_systems_mouse_device::mouse_systems_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : serial_mouse_device(mconfig, MSYSTEM_SERIAL_MOUSE, tag, owner, clock) -{ -} - -void serial_mouse_device::device_start() -{ - m_timer = timer_alloc(); - m_enabled = false; - set_frame(); - set_tra_rate(1200); - reset_mouse(); - - save_item(NAME(m_dtr)); - save_item(NAME(m_rts)); - save_item(NAME(m_queue)); - save_item(NAME(m_head)); - save_item(NAME(m_tail)); - save_item(NAME(m_mb)); - save_item(NAME(m_enabled)); -} - -void serial_mouse_device::reset_mouse() -{ - m_head = m_tail = 0; - output_rxd(1); - output_dcd(0); - output_dsr(0); - output_ri(0); - output_cts(0); -} - -void serial_mouse_device::tra_complete() -{ - if(m_tail != m_head) - transmit_register_setup(unqueue_data()); -} - -void serial_mouse_device::tra_callback() -{ - output_rxd(transmit_register_get_data_bit()); -} - -/************************************************************************** - * Check for mouse moves and buttons. Build delta x/y packets - **************************************************************************/ -void serial_mouse_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - if (!id) - { - static int ox = 0, oy = 0; - int nx,ny; - int dx, dy, nb; - int mbc; - - /* Do not get deltas or send packets if queue is not empty (Prevents drifting) */ - if (m_head==m_tail) - { - nx = m_x->read(); - - dx = nx - ox; - if (dx<=-0x800) dx = nx + 0x1000 - ox; /* Prevent jumping */ - if (dx>=0x800) dx = nx - 0x1000 - ox; - ox = nx; - - ny = m_y->read(); - - dy = ny - oy; - if (dy<=-0x800) dy = ny + 0x1000 - oy; - if (dy>=0x800) dy = ny - 0x1000 - oy; - oy = ny; - - nb = m_btn->read(); - mbc = nb^m_mb; - m_mb = nb; - - /* check if there is any delta or mouse buttons changed */ - if ( (dx!=0) || (dy!=0) || (mbc!=0) ) - mouse_trans(dx, dy, nb, mbc); - } - - if(m_tail != m_head && is_transmit_register_empty()) - transmit_register_setup(unqueue_data()); - } -} - -void microsoft_mouse_device::mouse_trans(int dx, int dy, int nb, int mbc) -{ - /* split deltas into packets of -128..+127 max */ - do - { - uint8_t m0, m1, m2; - int ddx = (dx < -128) ? -128 : (dx > 127) ? 127 : dx; - int ddy = (dy < -128) ? -128 : (dy > 127) ? 127 : dy; - m0 = 0x40 | ((nb << 4) & 0x30) | ((ddx >> 6) & 0x03) | ((ddy >> 4) & 0x0c); - m1 = ddx & 0x3f; - m2 = ddy & 0x3f; - - /* KT - changed to use a function */ - queue_data(m0 | 0x40); - queue_data(m1 & 0x03f); - queue_data(m2 & 0x03f); - if ((mbc & 0x04) != 0) /* If button 3 changed send extra byte */ - queue_data( (nb & 0x04) << 3); - - dx -= ddx; - dy -= ddy; - } while( dx || dy ); -} - -/* mouse systems mouse - from "PC Mouse information" by Tomi Engdahl */ - -/* - The data is sent in 5 byte packets in following format: - D7 D6 D5 D4 D3 D2 D1 D0 - - 1. 1 0 0 0 0 LB CB RB - 2. X7 X6 X5 X4 X3 X2 X1 X0 - 3. Y7 Y6 Y5 Y4 Y3 Y4 Y1 Y0 - 4. X7' X6' X5' X4' X3' X2' X1' X0' - 5. Y7' Y6' Y5' Y4' Y3' Y4' Y1' Y0' - - LB is left button state (0=pressed, 1=released) - CB is center button state (0=pressed, 1=released) - RB is right button state (0=pressed, 1=released) - X7-X0 movement in X direction since last packet in signed byte - format (-128..+127), positive direction right - Y7-Y0 movement in Y direction since last packet in signed byte - format (-128..+127), positive direction up - X7'-X0' movement in X direction since sending of X7-X0 packet in signed byte - format (-128..+127), positive direction right - Y7'-Y0' movement in Y direction since sending of Y7-Y0 in signed byte - format (-128..+127), positive direction up - - The last two bytes in the packet (bytes 4 and 5) contains information - about movement data changes which have occurred after data bytes 2 and 3 have been sent. */ - -void mouse_systems_mouse_device::mouse_trans(int dx, int dy, int nb, int mbc) -{ - dy =-dy; - - do - { - int ddx = (dx < -128) ? -128 : (dx > 127) ? 127 : dx; - int ddy = (dy < -128) ? -128 : (dy > 127) ? 127 : dy; - - /* KT - changed to use a function */ - queue_data(0x080 | ((((nb & 0x04) >> 1) + ((nb & 0x02) << 1) + (nb & 0x01)) ^ 0x07)); - queue_data(ddx); - queue_data(ddy); - /* for now... */ - queue_data(0); - queue_data(0); - dx -= ddx; - dy -= ddy; - } while( dx || dy ); -} - -/************************************************************************** - * Check for mouse control line changes and (de-)install timer - **************************************************************************/ - -void serial_mouse_device::set_mouse_enable(bool state) -{ - if(state && !m_enabled) - { - m_timer->adjust(attotime::zero, 0, attotime::from_hz(240)); - } - else if(!state && m_enabled) - { - m_timer->adjust(attotime::never); - m_head = m_tail = 0; - } - m_enabled = state; - -} - - -WRITE_LINE_MEMBER(serial_mouse_device::input_dtr) -{ - m_dtr = state; - check_state(); -} - -WRITE_LINE_MEMBER(serial_mouse_device::input_rts) -{ - m_rts = state; - check_state(); -} - -WRITE_LINE_MEMBER(microsoft_mouse_device::input_rts) -{ - if (!m_dtr && m_rts && !state) - { - reset_mouse(); - /* Identify as Microsoft 3 Button Mouse */ - queue_data('M'); - queue_data('3'); - } - - serial_mouse_device::input_rts(state); -} - - - -/************************************************************************** - * Mouse INPUT_PORT declarations - **************************************************************************/ - -static INPUT_PORTS_START( ser_mouse ) - PORT_START( "ser_mouse_btn" ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Mouse Left Button") PORT_CODE(MOUSECODE_BUTTON1) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Mouse Middle Button") PORT_CODE(MOUSECODE_BUTTON3) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Mouse Right Button") PORT_CODE(MOUSECODE_BUTTON2) - - PORT_START( "ser_mouse_x" ) /* Mouse - X AXIS */ - PORT_BIT( 0xfff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1) - - PORT_START( "ser_mouse_y" ) /* Mouse - Y AXIS */ - PORT_BIT( 0xfff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1) -INPUT_PORTS_END - -ioport_constructor serial_mouse_device::device_input_ports() const -{ - return INPUT_PORTS_NAME(ser_mouse); -} diff --git a/src/devices/bus/rs232/ser_mouse.h b/src/devices/bus/rs232/ser_mouse.h deleted file mode 100644 index ff4e7a81995..00000000000 --- a/src/devices/bus/rs232/ser_mouse.h +++ /dev/null @@ -1,84 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:smf -/***************************************************************************** - * - * machine/ser_mouse.h - * - ****************************************************************************/ - -#ifndef MAME_BUS_RS232_SER_MOUSE_H -#define MAME_BUS_RS232_SER_MOUSE_H - -#include "rs232.h" -#include "diserial.h" - -class serial_mouse_device : - public device_t, - public device_rs232_port_interface, - public device_serial_interface -{ -public: - virtual ioport_constructor device_input_ports() const override; - -protected: - serial_mouse_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - - virtual void device_start() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - - virtual void mouse_trans(int dx, int dy, int nb, int mbc) = 0; - virtual void set_frame() = 0; - void set_mouse_enable(bool state); - void queue_data(uint8_t data) {m_queue[m_head] = data; ++m_head %= 256;} - uint8_t unqueue_data() {uint8_t ret = m_queue[m_tail]; ++m_tail %= 256; return ret;} - virtual void tra_complete() override; - virtual void tra_callback() override; - void reset_mouse(); - - virtual WRITE_LINE_MEMBER(input_dtr) override; - virtual WRITE_LINE_MEMBER(input_rts) override; - - int m_dtr; - int m_rts; - -private: - void check_state() { set_mouse_enable(!m_dtr && !m_rts); } - - uint8_t m_queue[256]; - uint8_t m_head, m_tail, m_mb; - - emu_timer *m_timer; - bool m_enabled; - - required_ioport m_x; - required_ioport m_y; - required_ioport m_btn; -}; - -class microsoft_mouse_device : public serial_mouse_device -{ -public: - microsoft_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - virtual WRITE_LINE_MEMBER(input_rts) override; - - virtual void set_frame() override { set_data_frame(1, 7, PARITY_NONE, STOP_BITS_2); } - virtual void mouse_trans(int dx, int dy, int nb, int mbc) override; -}; - -DECLARE_DEVICE_TYPE(MSFT_SERIAL_MOUSE, microsoft_mouse_device) - -class mouse_systems_mouse_device : public serial_mouse_device -{ -public: - mouse_systems_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - virtual void set_frame() override { set_data_frame(1, 8, PARITY_NONE, STOP_BITS_2); } - virtual void mouse_trans(int dx, int dy, int nb, int mbc) override; -}; - -DECLARE_DEVICE_TYPE(MSYSTEM_SERIAL_MOUSE, mouse_systems_mouse_device) - -#endif // MAME_BUS_RS232_SER_MOUSE_H diff --git a/src/devices/bus/sbus/sbus.cpp b/src/devices/bus/sbus/sbus.cpp index 4c876cffd50..f8363194c5a 100644 --- a/src/devices/bus/sbus/sbus.cpp +++ b/src/devices/bus/sbus/sbus.cpp @@ -30,7 +30,7 @@ void sbus_cards(device_slot_interface &device) device.option_add("turbogxp", SBUS_TURBOGXP); /* Sun TurboGX+ 8-bit color display board */ device.option_add("sunpc", SBUS_SUNPC); /* Sun SunPC 5x86 Accelerator board */ device.option_add("hme", SBUS_HME); /* Sun SunSwift 10/100 + Fast Wide SCSI "Colossus" board */ - device.option_add("sb300p", SBUS_SB300P); /* Artecon CB300P 3-serial/4-parallel board */ + device.option_add("sb300p", SBUS_SB300P); /* Artecon CB300P 3-serial/1-parallel board */ } DEFINE_DEVICE_TYPE(SBUS_SLOT, sbus_slot_device, "sbus_slot", "Sun SBus Slot") diff --git a/src/devices/bus/sunkbd/hlekbd.cpp b/src/devices/bus/sunkbd/hlekbd.cpp index 48b16f13348..2cb5547947e 100644 --- a/src/devices/bus/sunkbd/hlekbd.cpp +++ b/src/devices/bus/sunkbd/hlekbd.cpp @@ -21,7 +21,7 @@ 0000 0011 bell off 0000 1010 enable keyclick (5ms duration 480us period on make) 0000 1011 disable keyclick - 0000 1110 ---k lscn LED (1 = on, k = kana, l = caps lock, s = scroll lock, c = compose, n = num lock) + 0000 1110 ---k lscn LED (1 = on: k = kana, l = caps lock, s = scroll lock, c = compose, n = num lock) 0000 1111 layout request (keyboard responds with layout response) message from keyboad to host: @@ -101,7 +101,7 @@ control on home row, caps lock at bottom left corner of main area - Type 5 International layout: + Type 5 International (ISO) layout: 76 1d 05 06 08 0a 0c 0e 10 11 12 07 09 0b 16 17 15 2d 02 04 30 @@ -114,7 +114,7 @@ double-height return key, 58 (US backslash) moved to home row, 7c added on left of bottom row - Type 5 Japanese layout: + Type 5 Japanese (JIS) layout: 76 1d 05 06 08 0a 0c 0e 10 11 12 07 09 0b 16 17 15 2d 02 04 30 @@ -127,8 +127,8 @@ double-height return key yen/pipe replaces backtick/tilde at top left corner of main area linefeed scancode repurposed for backslash/underscore - kana replaces alt graph (with LED window) - extra kakutei, henkan and nihongo on-off keys + kana (かな) replaces alt graph (with LED window) + extra kakutei (確定), henkan (変換) and nihongo on-off (日本語 On-Off) keys */ @@ -148,6 +148,7 @@ DEFINE_DEVICE_TYPE_NS(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd, hle_type5_jp_devic namespace bus { namespace sunkbd { namespace { + /*************************************************************************** INPUT PORT DEFINITIONS ***************************************************************************/ @@ -941,13 +942,13 @@ void hle_device_base::key_break(uint8_t row, uint8_t column) assert(!fifo_full()); assert(m_make_count); - // send the break code, and the idle code if no other keysa are down + // send the break code, and the idle code if no other keys are down transmit_byte(0x80U | (row << 4) | column); if (!--m_make_count) transmit_byte(0x7fU); - // check our counting - assert(are_all_keys_up() == !bool(m_make_count)); + // this blows up if a key is pressed just as the last key is released + //assert(are_all_keys_up() == !bool(m_make_count)); } diff --git a/src/devices/bus/sunkbd/hlekbd.h b/src/devices/bus/sunkbd/hlekbd.h index a4f6d886f5c..4f442daad4a 100644 --- a/src/devices/bus/sunkbd/hlekbd.h +++ b/src/devices/bus/sunkbd/hlekbd.h @@ -122,6 +122,7 @@ public: device_t *owner, uint32_t clock); +protected: virtual ioport_constructor device_input_ports() const override; private: @@ -138,6 +139,7 @@ public: device_t *owner, uint32_t clock); +protected: virtual ioport_constructor device_input_ports() const override; }; @@ -151,6 +153,7 @@ public: device_t *owner, uint32_t clock); +protected: virtual ioport_constructor device_input_ports() const override; }; @@ -164,6 +167,7 @@ public: device_t *owner, uint32_t clock); +protected: virtual ioport_constructor device_input_ports() const override; }; @@ -177,6 +181,7 @@ public: device_t *owner, uint32_t clock); +protected: virtual ioport_constructor device_input_ports() const override; }; @@ -190,6 +195,7 @@ public: device_t *owner, uint32_t clock); +protected: virtual ioport_constructor device_input_ports() const override; }; diff --git a/src/devices/bus/sunkbd/sunkbd.cpp b/src/devices/bus/sunkbd/sunkbd.cpp index 2ac0eb65b4c..82152b5f905 100644 --- a/src/devices/bus/sunkbd/sunkbd.cpp +++ b/src/devices/bus/sunkbd/sunkbd.cpp @@ -1,5 +1,92 @@ // license:BSD-3-Clause // copyright-holders:Vas Crabb +/* + Sun keyboard port + + Pre-USB Sun keyboards use an asynchronous serial protocol. Data is + transmitted at TTL levels using an asynchronous serial protocol at + 1,200 Baud. The protocol remained compatible from at least the + Type 2 keyboard to the Type 6 keyboard, although key layout and key + cap labels varied, some scancodes were repurposed, and a variety of + connectors were used. + + From the Sun 2/50 onwards, the keyboard and mouse share a single + connector, either using a splitter adapter, or by plugging the mouse + into a pass-through connector on the keyboard. + + Type 3 female DA-15 connector on host (introduced on Sun 2/50): + 1: keyboard RxD 9: GND + 2: GND 10: +5V + 3: keyboard TxD 11: +5V + 4: GND 12: +5V + 5: mouse RxD 13: +5V + 6: GND 14: +5V + 7: mouse TxD 15: +5V + 8: GND + + Type 4 female Mini-DIN-8 connector on host (introduced on Sun 3/80): + 1: GND 3: +5V 6: keyboard RxD + 2: GND 4: mouse RxD 7: mouse TxD + 5: keyboard TxD 8: +5V + + Type 5 female Mini-DIN-8 connector on host: + 1: GND 3: +5V 6: keyboard RxD + 2: GND 4: mouse RxD 7: power key + 5: keyboard TxD 8: +5V + + Scancodes (U.S. caps except as noted): + 00: 20: 3 40: [ { 60: Page Up + 01: L1/Stop 21: 5 41: ] } 61: L10/Cut + 02: Volume Down 22: 5 42: Delete 62: Num Lock + 03: L2/Again 23: 6 43: Compose 63: Left Shift + 04: Volume Up 24: 7 44: R7/KP 7 64: Z + 05: F1 25: 8 45: R8/KP 8 65: X + 06: F2 26: 9 46: R9/KP 9 66: C + 07: F10 27: 0 47: KP - 67: V + 08: F3 28: - _ 48: L7/Open 68: B + 09: F11 29: = + 49: L8/Paste 69: N + 0a: F4 2a: ` ~ 4a: End 6a: M + 0b: F12 2b: Backspace 4b: 6b: , < + 0c: F5 2c: Insert 4c: Control 6c: . > + 0d: Alt Graph 2d: R4/KP =/Mute 4d: A 6d: / ? + 0e: F6 2e: R5/KP / 4e: S 6e: Right Shift + 0f: Blank 2f: R6/KP * 4f: D 6f: Line Feed/\ _ + 10: F7 30: Power 50: F 70: R13/KP 1 + 11: F8 31: L5/Front 51: G 71: R14/KP 2 + 12: F9 32: KP . 52: H 72: R15/KP 3 + 13: Alt 33: L6/Copy 53: J 73: Kakutei + 14: Cursor Up 34: Home 54: K 74: Henkan + 15: R1/Pause 35: Tab 55: L 75: Nihongo On-Off + 16: R2/Print Screen 36: Q 56: ; : 76: Help + 17: R3/Scroll Lock 37: W 57: ' " 77: Caps Lock + 18: Cursor Left 38: E 58: \ | 78: Left Meta + 19: L3/Props 39: R 59: Return 79: Space + 1a: L4/Undo 3a: T 5a: Enter 7a: Right Meta + 1b: Cursor Down 3b: Y 5b: R10/KP 4 7b: Page Down + 1c: Cursor Right 3c: U 5c: R11/KP 5 7c: < > + 1d: Escape 3d: I 5d: R12/KP 6 7d: KP + + 1e: 1 3e: O 5e: KP 0 7e: + 1f: 2 3f: P 5f: L9/Find 7f: + + 7e and 7f are reserved for special messages. + L function group and R function group repurposed on Type 4 keyboard. + F10, F11, F12, Alt Graph, Compose, and Help added on Type 4 keyboard. + Num Lock, KP -, KP +, KP 0, KP ., and Enter added on Type 4 keyboard. + Line Feed removed from Type 5 keyboard. + Cursor Up, Cursor Down, Cursor Left, and Cursor Right added on Type 5 keyboard. + Insert, Home, End, Page Up, and Page Down added on Type 5 keyboard. + Volume Down, Volume Up, and Power added on Type 5 keyboard. + KP = repurposed for Mute on Type 5 keyboard. + Blank key only present on Type 5 UNIX keyboard. + < > only present on Type 5 International (ISO) keyboard. + Line Feed repurposed for backslash/underscore on Type 5 Japanese (JIS) keyboard. + Kakutei, Henkan, and Nihongo On-Off only present on Type 5 Japanese (JIS) keyboard. + + TODO: + * Add power key line for soft power sun4c and later systems. + * Confirm actual logic levels. + * Dump keyboard microcontrollers. +*/ #include "emu.h" #include "sunkbd.h" @@ -52,6 +139,19 @@ void sun_keyboard_port_device::device_config_complete() } +void sun_keyboard_port_device::device_validity_check(validity_checker &valid) const +{ + device_t *const card(get_card_device()); + if (card && !dynamic_cast<device_sun_keyboard_port_interface *>(card)) + { + osd_printf_error( + "Card device %s (%s) does not implement device_sun_keyboard_port_interface\n", + card->tag(), + card->name()); + } +} + + void sun_keyboard_port_device::device_resolve_objects() { m_rxd_handler.resolve_safe(); @@ -60,6 +160,14 @@ void sun_keyboard_port_device::device_resolve_objects() void sun_keyboard_port_device::device_start() { + if (get_card_device() && !m_dev) + { + throw emu_fatalerror( + "Card device %s (%s) does not implement device_sun_keyboard_port_interface\n", + get_card_device()->tag(), + get_card_device()->name()); + } + save_item(NAME(m_rxd)); m_rxd = 1; diff --git a/src/devices/bus/sunkbd/sunkbd.h b/src/devices/bus/sunkbd/sunkbd.h index 43f60067a46..532193cbf0d 100644 --- a/src/devices/bus/sunkbd/sunkbd.h +++ b/src/devices/bus/sunkbd/sunkbd.h @@ -28,7 +28,7 @@ public: sun_keyboard_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); virtual ~sun_keyboard_port_device(); - // static configuration helpers + // configuration helpers auto rxd_handler() { return m_rxd_handler.bind(); } DECLARE_WRITE_LINE_MEMBER( write_txd ); @@ -38,9 +38,10 @@ public: protected: sun_keyboard_port_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock); + virtual void device_config_complete() override; + virtual void device_validity_check(validity_checker &valid) const override; virtual void device_resolve_objects() override; virtual void device_start() override; - virtual void device_config_complete() override; int m_rxd; @@ -58,13 +59,13 @@ class device_sun_keyboard_port_interface : public device_slot_card_interface public: virtual ~device_sun_keyboard_port_interface() override; +protected: + device_sun_keyboard_port_interface(machine_config const &mconfig, device_t &device); + virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) { } DECLARE_WRITE_LINE_MEMBER( output_rxd ) { m_port->m_rxd = state; m_port->m_rxd_handler(state); } -protected: - device_sun_keyboard_port_interface(machine_config const &mconfig, device_t &device); - sun_keyboard_port_device *m_port; static constexpr int START_BIT_COUNT = 1; diff --git a/src/devices/bus/sunmouse/hlemouse.cpp b/src/devices/bus/sunmouse/hlemouse.cpp new file mode 100644 index 00000000000..fb08b95232e --- /dev/null +++ b/src/devices/bus/sunmouse/hlemouse.cpp @@ -0,0 +1,314 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +#include "emu.h" +#include "hlemouse.h" + +#define LOG_GENERAL (1U << 0) +#define LOG_BIT (1U << 1) + +//#define VERBOSE (LOG_GENERAL | LOG_BIT) +//#define LOG_OUTPUT_STREAM std::cerr + +#include "logmacro.h" + +#define LOGBIT(...) LOGMASKED(LOG_BIT, __VA_ARGS__) + + +/* + Mostly compatible with the Mouse Systems "non-rotatable" protocol. + The only real difference is that the mouse may send a 3-byte frame + if the movement in each axis doesn't exceed the range -120 to 127 + counts (values in the range -128 to -121 are indistinguishable from + button states). +*/ + + +/*************************************************************************** + DEVICE TYPE GLOBALS +***************************************************************************/ + +DEFINE_DEVICE_TYPE_NS(SUN_1200BAUD_HLE_MOUSE, bus::sunmouse, hle_1200baud_device, "sunmouse_hle1200", "Sun Mouse (1200 Baud, HLE)") +DEFINE_DEVICE_TYPE_NS(SUN_4800BAUD_HLE_MOUSE, bus::sunmouse, hle_4800baud_device, "sunmouse_hle4800", "Sun Mouse (4800 Baud, HLE)") + +namespace bus { namespace sunmouse { + +namespace { + +INPUT_PORTS_START( mouse ) + PORT_START("BTN") + PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_device_base, input_changed, nullptr) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_device_base, input_changed, nullptr) + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_device_base, input_changed, nullptr) + + PORT_START("X") + PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_device_base, input_changed, nullptr) + + PORT_START("Y") + PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_device_base, input_changed, nullptr) +INPUT_PORTS_END + + +uint8_t extract_delta_byte(int32_t &delta) +{ + int32_t const result(std::min<int32_t>(std::max<int32_t>(delta, -120), 127)); + delta -= result; + return uint8_t(int8_t(result)); +} + +} // anonymous namespace + + + +/*************************************************************************** + BASE HLE MOUSE DEVICE +***************************************************************************/ + +hle_device_base::hle_device_base( + machine_config const &mconfig, + device_type type, + char const *tag, + device_t *owner, + uint32_t clock, + unsigned multiplier) + : device_t(mconfig, type, tag, owner, clock) + , device_serial_interface(mconfig, *this) + , device_sun_mouse_port_interface(mconfig, *this) + , m_buttons(*this, "BTN") + , m_x_axis(*this, "X") + , m_y_axis(*this, "Y") + , m_multiplier(multiplier) + , m_x_delta(0) + , m_y_delta(0) + , m_x_val(0U) + , m_y_val(0U) + , m_btn_sent(0x00U) + , m_btn_val(0x00U) + , m_phase(0U) +{ +} + + +hle_device_base::~hle_device_base() +{ +} + + +INPUT_CHANGED_MEMBER( hle_device_base::input_changed ) +{ + if (is_transmit_register_empty()) + { + assert((0U == m_phase) || (3U == m_phase)); + + check_inputs(); + if (0U == m_phase) + { + if (m_x_delta || m_y_delta || (m_btn_sent != m_btn_val)) + { + LOG("Inputs changed (B=%X->%x X=%d Y=%d) - sending button state\n", + m_btn_sent, + m_btn_val, + m_x_delta, + m_y_delta); + transmit_register_setup((m_btn_sent = m_btn_val) | 0x80U); + } + } + else if (m_x_delta || m_y_delta) + { + LOG("Inputs changed (B=%X->%x X=%d Y=%d) - sending X delta\n", + m_btn_sent, + m_btn_val, + m_x_delta, + m_y_delta); + transmit_register_setup(extract_delta_byte(m_x_delta)); + } + else if (m_btn_sent != m_btn_val) + { + LOG("Inputs changed (B=%X->%x X=%d Y=%d) - sending button state\n", + m_btn_sent, + m_btn_val, + m_x_delta, + m_y_delta); + m_phase = 0U; + transmit_register_setup((m_btn_sent = m_btn_val) | 0x80U); + } + } + else + { + LOG("Ignoring input changed while transmit register not empty\n"); + } +} + + +ioport_constructor hle_device_base::device_input_ports() const +{ + return INPUT_PORTS_NAME(mouse); +} + + +void hle_device_base::device_start() +{ + save_item(NAME(m_x_delta)); + save_item(NAME(m_y_delta)); + save_item(NAME(m_x_val)); + save_item(NAME(m_y_val)); + save_item(NAME(m_phase)); + + set_data_frame(START_BIT_COUNT, DATA_BIT_COUNT, PARITY, STOP_BITS); + set_rate(BAUD * m_multiplier); + receive_register_reset(); + transmit_register_reset(); + + output_rxd(0); + + m_x_delta = 0; + m_y_delta = 0; + m_btn_sent = 0x00U; + m_phase = 0U; +} + + +void hle_device_base::device_reset() +{ + m_x_val = m_x_axis->read(); + m_y_val = m_y_axis->read(); + m_btn_val = m_buttons->read(); +} + + +void hle_device_base::tra_callback() +{ + int const bit(transmit_register_get_data_bit() ? 0 : 1); + LOGBIT("Send bit !%d\n", bit); + output_rxd(bit); +} + + +void hle_device_base::tra_complete() +{ + check_inputs(); + + if (4U <= m_phase) + m_phase = 0U; + else + ++m_phase; + + switch (m_phase) + { + // sent second Y delta - send button state if anything changed + case 0U: + if (m_x_delta || m_y_delta || (m_btn_sent != m_btn_val)) + { + LOG("Sent Y delta (B=%X->%x X=%d Y=%d) - sending button state\n", + m_btn_sent, + m_btn_val, + m_x_delta, + m_y_delta); + transmit_register_setup((m_btn_sent = m_btn_val) | 0x80U); + } + else + { + LOG("Sent Y delta (B=%X->%x X=%d Y=%d) - nothing to send\n", + m_btn_sent, + m_btn_val, + m_x_delta, + m_y_delta); + } + break; + + // can wait after sending first Y delta + case 3U: + if (!m_x_delta && !m_y_delta && (m_btn_sent == m_btn_val)) + { + LOG("Sent Y delta (B=%X->%x X=%d Y=%d) - nothing to send\n", + m_btn_sent, + m_btn_val, + m_x_delta, + m_y_delta); + //break; uncommenting this causes problems with early versions of Solaris + } + case 1U: + LOG("Sent %s (B=%X->%x X=%d Y=%d) - sending X delta\n", + (1U == m_phase) ? "button state" : "Y delta", + m_btn_sent, + m_btn_val, + m_x_delta, + m_y_delta); + transmit_register_setup(extract_delta_byte(m_x_delta)); + break; + + // sent X delta - always follow with Y delta + case 2U: + case 4U: + LOG("Sent X delta (B=%X->%x X=%d Y=%d) - sending Y delta\n", + m_btn_sent, + m_btn_val, + m_x_delta, + m_y_delta); + transmit_register_setup(extract_delta_byte(m_y_delta)); + break; + } +} + + +void hle_device_base::check_inputs() +{ + // read new axis values and get difference + uint16_t const x_val(m_x_axis->read()); + uint16_t const y_val(m_y_axis->read()); + int16_t x_delta(x_val - m_x_val); + int16_t y_delta(y_val - m_y_val); + + // deal with wraparound + if (0x0800 <= x_delta) + x_delta -= 0x1000; + else if (-0x0800 >= x_delta) + x_delta += 0x1000; + if (0x0800 <= y_delta) + y_delta -= 0x1000; + else if (-0x0800 >= y_delta) + x_delta += 0x1000; + + // update state + m_x_delta += x_delta; + m_y_delta -= y_delta; + m_x_val = x_val; + m_y_val = y_val; + + // read new button values + m_btn_val = m_buttons->read(); +} + + + +/*************************************************************************** + 1200 BAUD HLE MOUSE DEVICE +***************************************************************************/ + +hle_1200baud_device::hle_1200baud_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock) + : hle_device_base(mconfig, SUN_1200BAUD_HLE_MOUSE, tag, owner, clock, 8U) // FIXME: hack because z80scc isn't working properly +{ +} + + + +/*************************************************************************** + 4800 BAUD HLE MOUSE DEVICE +***************************************************************************/ + +hle_4800baud_device::hle_4800baud_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock) + : hle_device_base(mconfig, SUN_4800BAUD_HLE_MOUSE, tag, owner, clock, 4U) +{ +} + +} } // namespace bus::sunmouse diff --git a/src/devices/bus/sunmouse/hlemouse.h b/src/devices/bus/sunmouse/hlemouse.h new file mode 100644 index 00000000000..6eb5cf44b63 --- /dev/null +++ b/src/devices/bus/sunmouse/hlemouse.h @@ -0,0 +1,82 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +#ifndef MAME_DEVICES_SUNMOUSE_HLEMOUSE_H +#define MAME_DEVICES_SUNMOUSE_HLEMOUSE_H + +#pragma once + +#include "sunmouse.h" +#include "diserial.h" + + +namespace bus { namespace sunmouse { + +class hle_device_base + : public device_t + , public device_serial_interface + , public device_sun_mouse_port_interface +{ +public: + virtual ~hle_device_base() override; + + DECLARE_INPUT_CHANGED_MEMBER( input_changed ); + +protected: + // constructor/destructor + hle_device_base( + machine_config const &mconfig, + device_type type, + char const *tag, + device_t *owner, + uint32_t clock, + unsigned multiplier); + + // device overrides + virtual ioport_constructor device_input_ports() const override; + virtual void device_start() override; + virtual void device_reset() override; + + // device_serial_interface overrides + virtual void tra_callback() override; + virtual void tra_complete() override; + +private: + void check_inputs(); + + required_ioport m_buttons, m_x_axis, m_y_axis; + unsigned const m_multiplier; + int32_t m_x_delta, m_y_delta; + uint16_t m_x_val, m_y_val; + uint8_t m_btn_sent, m_btn_val; + uint8_t m_phase; +}; + + +class hle_1200baud_device : public hle_device_base +{ +public: + hle_1200baud_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock); +}; + + +class hle_4800baud_device : public hle_device_base +{ +public: + hle_4800baud_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock); +}; + +} } // namespace bus::sunmouse + + +DECLARE_DEVICE_TYPE_NS(SUN_1200BAUD_HLE_MOUSE, bus::sunmouse, hle_1200baud_device) +DECLARE_DEVICE_TYPE_NS(SUN_4800BAUD_HLE_MOUSE, bus::sunmouse, hle_4800baud_device) + +#endif // MAME_DEVICES_SUNMOUSE_HLEMOUSE_H diff --git a/src/devices/bus/sunmouse/sunmouse.cpp b/src/devices/bus/sunmouse/sunmouse.cpp new file mode 100644 index 00000000000..9b59529c54a --- /dev/null +++ b/src/devices/bus/sunmouse/sunmouse.cpp @@ -0,0 +1,184 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/* + Sun mouse port + + Before USB, Sun used an asynchronous serial mouse protocol. Data is + transmitted at TTL levels using an asynchronous serial protocol. + The mouse RxD line is pulled up by the host and driven low by an + open collector driver in the mouse for the mark (1) condition. This + means that if no mouse is connected, the host will see a break + condition. The protocol is mostly compatible with the Mouse Systems + "non-rotatable" protocol. + + Most Sun mouse port devices transmit data at 1,200 Baud. However, + some devices transmit at 4,800 Baud, and it's possible to modify any + Sun Type 5 mouse for 4,800 Baud operation. Solaris 2.3 or later is + required to support a 4,800 Baud mouse. + + From the Sun 2/50 onwards, the keyboard and mouse share a single + connector, either using a splitter adapter, or by plugging the mouse + into a pass-through connector on the keyboard. + + Type 3 female DA-15 connector on host (introduced on Sun 2/50): + 1: keyboard RxD 9: GND + 2: GND 10: +5V + 3: keyboard TxD 11: +5V + 4: GND 12: +5V + 5: mouse RxD 13: +5V + 6: GND 14: +5V + 7: mouse TxD 15: +5V + 8: GND + + Type 4 female Mini-DIN-8 connector on host (introduced on Sun 3/80): + 1: GND 3: +5V 6: keyboard RxD + 2: GND 4: mouse RxD 7: mouse TxD + 5: keyboard TxD 8: +5V + + Type 5 female Mini-DIN-8 connector on host: + 1: GND 3: +5V 6: keyboard RxD + 2: GND 4: mouse RxD 7: power key + 5: keyboard TxD 8: +5V + + Type 5 and later sacrifice the TxD line from the host to the mouse + in favour of a dedicated line for the soft power key. It was never + used for anything useful with standard Sun peripherals anyway. + + Sun 2 and Sun 3 used an optical mouse made by Mouse Systems. The + colour varied (usually black for Sun 2 and white for Sun 3). They + require a Mouse Systems optical mouse pad to work correctly. The + later Sun optical mouse for Sun 4 requires a different pad with + thinner stripes. + + The Logitech Trackman T-CB1 is a compatible replacement for a Sun + Type 4 or Type 5 mouse, made at Sun's request. + + Known Sun mouse part numbers: + * 370-1169: Type 4 optical mouse (manufactured by Mouse Systems) + * 370-1398: Type 5 optical mouse (bridge JP2 for 4,800 Baud) + * 370-1586-01: SPARCstation Voyager 4,800 Baud mouse + * 370-1586-02: Type 5 opto-mechanical mouse + * 370-1586-03: Type 5 opto-mechanical mouse + + TODO: + * Confirm polarity of TxD signal from host to mouse. + * Dump mouse microcontrollers. +*/ + +#include "emu.h" +#include "sunmouse.h" + + +DEFINE_DEVICE_TYPE(SUNMOUSE_PORT, sun_mouse_port_device, "sunmouse", "Sun Mouse Port") + + +int const device_sun_mouse_port_interface::START_BIT_COUNT; +int const device_sun_mouse_port_interface::DATA_BIT_COUNT; +device_serial_interface::parity_t const device_sun_mouse_port_interface::PARITY; +device_serial_interface::stop_bits_t const device_sun_mouse_port_interface::STOP_BITS; +int const device_sun_mouse_port_interface::BAUD; + + + +sun_mouse_port_device::sun_mouse_port_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock) + : sun_mouse_port_device(mconfig, SUNMOUSE_PORT, tag, owner, clock) +{ +} + + +sun_mouse_port_device::sun_mouse_port_device( + machine_config const &mconfig, + device_type type, + char const *tag, + device_t *owner, + uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , device_slot_interface(mconfig, *this) + , m_rxd(0) + , m_rxd_handler(*this) + , m_dev(nullptr) +{ +} + + +sun_mouse_port_device::~sun_mouse_port_device() +{ +} + + +void sun_mouse_port_device::device_config_complete() +{ + m_dev = dynamic_cast<device_sun_mouse_port_interface *>(get_card_device()); +} + + +void sun_mouse_port_device::device_validity_check(validity_checker &valid) const +{ + device_t *const card(get_card_device()); + if (card && !dynamic_cast<device_sun_mouse_port_interface *>(card)) + { + osd_printf_error( + "Card device %s (%s) does not implement device_sun_mouse_port_interface\n", + card->tag(), + card->name()); + } +} + + +void sun_mouse_port_device::device_resolve_objects() +{ + m_rxd = 1; + + m_rxd_handler.resolve_safe(); +} + + +void sun_mouse_port_device::device_start() +{ + if (get_card_device() && !m_dev) + { + throw emu_fatalerror( + "Card device %s (%s) does not implement device_sun_mouse_port_interface\n", + get_card_device()->tag(), + get_card_device()->name()); + } + + save_item(NAME(m_rxd)); + + if (!m_dev) + m_rxd_handler(m_rxd = 0); +} + + +WRITE_LINE_MEMBER( sun_mouse_port_device::write_txd ) +{ + if (m_dev) + m_dev->input_txd(state ? 0 : 1); +} + + + +device_sun_mouse_port_interface::device_sun_mouse_port_interface(machine_config const &mconfig, device_t &device) + : device_slot_card_interface(mconfig, device) + , m_port(dynamic_cast<sun_mouse_port_device *>(device.owner())) +{ +} + + +device_sun_mouse_port_interface::~device_sun_mouse_port_interface() +{ +} + + + +#include "hlemouse.h" + +void default_sun_mouse_devices(device_slot_interface &device) +{ + device.option_add("hle1200", SUN_1200BAUD_HLE_MOUSE); + device.option_add("hle4800", SUN_4800BAUD_HLE_MOUSE); +} diff --git a/src/devices/bus/sunmouse/sunmouse.h b/src/devices/bus/sunmouse/sunmouse.h new file mode 100644 index 00000000000..ff7dd9ca86a --- /dev/null +++ b/src/devices/bus/sunmouse/sunmouse.h @@ -0,0 +1,84 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +#ifndef MAME_BUS_SUNMOUSE_SUNMOUSE_H +#define MAME_BUS_SUNMOUSE_SUNMOUSE_H + +#pragma once + +#include "diserial.h" + + +class device_sun_mouse_port_interface; + + +class sun_mouse_port_device : public device_t, public device_slot_interface +{ + friend class device_sun_mouse_port_interface; + +public: + template <typename T> + sun_mouse_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt) + : sun_mouse_port_device(mconfig, tag, owner, 0) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + sun_mouse_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); + virtual ~sun_mouse_port_device(); + + // configuration helpers + auto rxd_handler() { return m_rxd_handler.bind(); } + + DECLARE_WRITE_LINE_MEMBER( write_txd ); + + DECLARE_READ_LINE_MEMBER( rxd_r ) { return m_rxd; } + +protected: + sun_mouse_port_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock); + + virtual void device_config_complete() override; + virtual void device_validity_check(validity_checker &valid) const override; + virtual void device_resolve_objects() override; + virtual void device_start() override; + + int m_rxd; + + devcb_write_line m_rxd_handler; + +private: + device_sun_mouse_port_interface *m_dev; +}; + + +class device_sun_mouse_port_interface : public device_slot_card_interface +{ + friend class sun_mouse_port_device; + +public: + virtual ~device_sun_mouse_port_interface() override; + +protected: + device_sun_mouse_port_interface(machine_config const &mconfig, device_t &device); + + virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) { } + + DECLARE_WRITE_LINE_MEMBER( output_rxd ) { m_port->m_rxd_handler(m_port->m_rxd = state ? 0 : 1); } + + sun_mouse_port_device *m_port; + + static constexpr int START_BIT_COUNT = 1; + static constexpr int DATA_BIT_COUNT = 8; + static constexpr device_serial_interface::parity_t PARITY = device_serial_interface::PARITY_NONE; + static constexpr device_serial_interface::stop_bits_t STOP_BITS = device_serial_interface::STOP_BITS_1; + static constexpr int BAUD = 1'200; +}; + + +DECLARE_DEVICE_TYPE(SUNMOUSE_PORT, sun_mouse_port_device) + + +void default_sun_mouse_devices(device_slot_interface &device); + +#endif // MAME_BUS_SUNMOUSE_SUNMOUSE_H diff --git a/src/devices/cpu/nec/v53.cpp b/src/devices/cpu/nec/v53.cpp index 82b811c873a..5abd00210c9 100644 --- a/src/devices/cpu/nec/v53.cpp +++ b/src/devices/cpu/nec/v53.cpp @@ -314,16 +314,16 @@ void v53_base_device::install_peripheral_io() if (IOAG) // 8-bit { - space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8_delegate(FUNC(v53_scu_device::data_r), (v53_scu_device*)m_v53scu), write8_delegate(FUNC(v53_scu_device::data_w), (v53_scu_device*)m_v53scu), 0x00ff); - space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8_delegate(FUNC(v53_scu_device::status_r), (v53_scu_device*)m_v53scu), write8_delegate(FUNC(v53_scu_device::command_w), (v53_scu_device*)m_v53scu), 0xff00); - space(AS_IO).install_write_handler(base+0x02, base+0x03, write8_delegate(FUNC(v53_scu_device::mode_w), (v53_scu_device*)m_v53scu), 0x00ff); + space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8smo_delegate(FUNC(v53_scu_device::data_r), m_v53scu.target()), write8smo_delegate(FUNC(v53_scu_device::data_w), m_v53scu.target()), 0x00ff); + space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8smo_delegate(FUNC(v53_scu_device::status_r), m_v53scu.target()), write8smo_delegate(FUNC(v53_scu_device::command_w), m_v53scu.target()), 0xff00); + space(AS_IO).install_write_handler(base+0x02, base+0x03, write8smo_delegate(FUNC(v53_scu_device::mode_w), m_v53scu.target()), 0x00ff); space(AS_IO).install_readwrite_handler(base+0x02, base+0x03, read8_delegate(FUNC(v53_base_device::scu_simk_r), this), write8_delegate(FUNC(v53_base_device::scu_simk_w), this), 0xff00); } else { - space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8_delegate(FUNC(v53_scu_device::data_r), (v53_scu_device*)m_v53scu), write8_delegate(FUNC(v53_scu_device::data_w), (v53_scu_device*)m_v53scu), 0x00ff); - space(AS_IO).install_readwrite_handler(base+0x02, base+0x03, read8_delegate(FUNC(v53_scu_device::status_r), (v53_scu_device*)m_v53scu), write8_delegate(FUNC(v53_scu_device::command_w), (v53_scu_device*)m_v53scu), 0x00ff); - space(AS_IO).install_write_handler(base+0x04, base+0x05, write8_delegate(FUNC(v53_scu_device::mode_w), (v53_scu_device*)m_v53scu), 0x00ff); + space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8smo_delegate(FUNC(v53_scu_device::data_r), m_v53scu.target()), write8smo_delegate(FUNC(v53_scu_device::data_w), m_v53scu.target()), 0x00ff); + space(AS_IO).install_readwrite_handler(base+0x02, base+0x03, read8smo_delegate(FUNC(v53_scu_device::status_r), m_v53scu.target()), write8smo_delegate(FUNC(v53_scu_device::command_w), m_v53scu.target()), 0x00ff); + space(AS_IO).install_write_handler(base+0x04, base+0x05, write8smo_delegate(FUNC(v53_scu_device::mode_w), m_v53scu.target()), 0x00ff); space(AS_IO).install_readwrite_handler(base+0x06, base+0x07, read8_delegate(FUNC(v53_base_device::scu_simk_r), this), write8_delegate(FUNC(v53_base_device::scu_simk_w), this), 0x00ff); } diff --git a/src/devices/cpu/psx/psx.cpp b/src/devices/cpu/psx/psx.cpp index 8c1f4977990..1ea5787328d 100644 --- a/src/devices/cpu/psx/psx.cpp +++ b/src/devices/cpu/psx/psx.cpp @@ -3462,11 +3462,11 @@ MACHINE_CONFIG_START(psxcpu_device::device_add_mconfig) MCFG_PSX_RCNT_IRQ1_HANDLER( WRITELINE( "irq", psxirq_device, intin5 ) ) MCFG_PSX_RCNT_IRQ2_HANDLER( WRITELINE( "irq", psxirq_device, intin6 ) ) - MCFG_DEVICE_ADD( "sio0", PSX_SIO0, 0 ) - MCFG_PSX_SIO_IRQ_HANDLER( WRITELINE( "irq", psxirq_device, intin7 ) ) + auto &sio0(PSX_SIO0(config, "sio0", DERIVED_CLOCK(1, 2))); + sio0.irq_handler().set("irq", FUNC(psxirq_device::intin7)); - MCFG_DEVICE_ADD( "sio1", PSX_SIO1, 0 ) - MCFG_PSX_SIO_IRQ_HANDLER( WRITELINE( "irq", psxirq_device, intin8 ) ) + auto &sio1(PSX_SIO1(config, "sio1", DERIVED_CLOCK(1, 2))); + sio1.irq_handler().set("irq", FUNC(psxirq_device::intin8)); RAM( config, "ram" ).set_default_value( 0x00 ); MACHINE_CONFIG_END diff --git a/src/devices/cpu/psx/sio.h b/src/devices/cpu/psx/sio.h index 0548480abeb..7e02b57330f 100644 --- a/src/devices/cpu/psx/sio.h +++ b/src/devices/cpu/psx/sio.h @@ -16,21 +16,6 @@ DECLARE_DEVICE_TYPE(PSX_SIO0, psxsio0_device) DECLARE_DEVICE_TYPE(PSX_SIO1, psxsio1_device) -#define MCFG_PSX_SIO_IRQ_HANDLER(_devcb) \ - downcast<psxsio_device &>(*device).set_irq_handler(DEVCB_##_devcb); - -#define MCFG_PSX_SIO_SCK_HANDLER(_devcb) \ - downcast<psxsio_device &>(*device).set_sck_handler(DEVCB_##_devcb); - -#define MCFG_PSX_SIO_TXD_HANDLER(_devcb) \ - downcast<psxsio_device &>(*device).set_txd_handler(DEVCB_##_devcb); - -#define MCFG_PSX_SIO_DTR_HANDLER(_devcb) \ - downcast<psxsio_device &>(*device).set_dtr_handler(DEVCB_##_devcb); - -#define MCFG_PSX_SIO_RTS_HANDLER(_devcb) \ - downcast<psxsio_device &>(*device).set_rts_handler(DEVCB_##_devcb); - #define SIO_BUF_SIZE ( 8 ) #define SIO_STATUS_TX_RDY ( 1 << 0 ) @@ -52,11 +37,11 @@ class psxsio_device : public device_t { public: // configuration helpers - template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_sck_handler(Object &&cb) { return m_sck_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_txd_handler(Object &&cb) { return m_txd_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_dtr_handler(Object &&cb) { return m_dtr_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_rts_handler(Object &&cb) { return m_rts_handler.set_callback(std::forward<Object>(cb)); } + auto irq_handler() { return m_irq_handler.bind(); } + auto sck_handler() { return m_sck_handler.bind(); } + auto txd_handler() { return m_txd_handler.bind(); } + auto dtr_handler() { return m_dtr_handler.bind(); } + auto rts_handler() { return m_rts_handler.bind(); } DECLARE_WRITE32_MEMBER( write ); DECLARE_READ32_MEMBER( read ); diff --git a/src/devices/cpu/sparc/mb86901.cpp b/src/devices/cpu/sparc/mb86901.cpp index ec7671333d7..fad89cf9610 100644 --- a/src/devices/cpu/sparc/mb86901.cpp +++ b/src/devices/cpu/sparc/mb86901.cpp @@ -184,9 +184,12 @@ void mb86901_device::device_start() m_alu_op3_assigned[OP3_WRTBR] = true; m_alu_op3_assigned[OP3_FPOP1] = true; m_alu_op3_assigned[OP3_FPOP2] = true; + m_alu_op3_assigned[OP3_CPOP1] = true; + m_alu_op3_assigned[OP3_CPOP2] = true; m_alu_op3_assigned[OP3_JMPL] = true; m_alu_op3_assigned[OP3_RETT] = true; m_alu_op3_assigned[OP3_TICC] = true; + m_alu_op3_assigned[OP3_IFLUSH] = true; m_alu_op3_assigned[OP3_SAVE] = true; m_alu_op3_assigned[OP3_RESTORE] = true; #if SPARCV8 @@ -198,8 +201,6 @@ void mb86901_device::device_start() m_alu_op3_assigned[OP3_SMULCC] = true; m_alu_op3_assigned[OP3_UDIVCC] = true; m_alu_op3_assigned[OP3_SDIVCC] = true; - m_alu_op3_assigned[OP3_CPOP1] = true; - m_alu_op3_assigned[OP3_CPOP2] = true; #endif m_program = &space(AS_PROGRAM); @@ -1489,6 +1490,10 @@ void mb86901_device::execute_group2(uint32_t op) execute_ticc(op); break; + case OP3_IFLUSH: + // Ignored + break; + case OP3_SAVE: case OP3_RESTORE: execute_saverestore(op); @@ -2941,7 +2946,7 @@ void mb86901_device::execute_step() m_execute_mode = 0; m_error_mode = 0; m_reset_mode = 1; - printf("Entering reset mode\n"); + //printf("Entering reset mode\n"); return; } else if ((PSR & PSR_ET_MASK) && (m_bp_irl == 15 || m_bp_irl > ((PSR & PSR_PIL_MASK) >> PSR_PIL_SHIFT))) @@ -3028,7 +3033,7 @@ void mb86901_device::reset_step() m_execute_mode = 1; m_trap = 1; m_reset_trap = 1; - printf("m_bp_reset_in is false, resetting\n"); + //printf("m_bp_reset_in is false, resetting\n"); } } diff --git a/src/devices/cpu/sparc/sparcdefs.h b/src/devices/cpu/sparc/sparcdefs.h index 823fb3e52f3..b3ebb95d589 100644 --- a/src/devices/cpu/sparc/sparcdefs.h +++ b/src/devices/cpu/sparc/sparcdefs.h @@ -208,6 +208,7 @@ #define OP3_JMPL 56 #define OP3_RETT 57 #define OP3_TICC 58 +#define OP3_IFLUSH 59 #define OP3_SAVE 60 #define OP3_RESTORE 61 diff --git a/src/devices/cpu/sparc/sparcv8ops.ipp b/src/devices/cpu/sparc/sparcv8ops.ipp index 28149ef6778..b2611d694f2 100644 --- a/src/devices/cpu/sparc/sparcv8ops.ipp +++ b/src/devices/cpu/sparc/sparcv8ops.ipp @@ -245,7 +245,7 @@ void mb86901_device::execute_div(uint32_t op) { uint32_t result = 0; bool temp_v = false; - int64_t temp_64bit; + int64_t temp_64bit = 0; if (UDIV || UDIVCC) { temp_64bit = int64_t(uint64_t((uint64_t(Y) << 32) | uint64_t(RS1REG)) / operand2); diff --git a/src/devices/machine/i8251.cpp b/src/devices/machine/i8251.cpp index d10c724a8f9..da883cd7b06 100644 --- a/src/devices/machine/i8251.cpp +++ b/src/devices/machine/i8251.cpp @@ -561,7 +561,7 @@ void i8251_device::mode_w(uint8_t data) } } -WRITE8_MEMBER(i8251_device::control_w) +void i8251_device::control_w(uint8_t data) { if (m_flags & I8251_EXPECTING_MODE) { @@ -599,7 +599,7 @@ WRITE8_MEMBER(i8251_device::control_w) status_r -------------------------------------------------*/ -READ8_MEMBER(i8251_device::status_r) +uint8_t i8251_device::status_r() { uint8_t status = (m_dsr << 7) | m_status; @@ -613,7 +613,7 @@ READ8_MEMBER(i8251_device::status_r) data_w -------------------------------------------------*/ -WRITE8_MEMBER(i8251_device::data_w) +void i8251_device::data_w(uint8_t data) { m_tx_data = data; @@ -666,7 +666,7 @@ void i8251_device::receive_character(uint8_t ch) data_r - read data -------------------------------------------------*/ -READ8_MEMBER(i8251_device::data_r) +uint8_t i8251_device::data_r() { LOG("read data: %02x, STATUS=%02x\n",m_rx_data,m_status); /* reading clears */ @@ -677,6 +677,23 @@ READ8_MEMBER(i8251_device::data_r) } +uint8_t i8251_device::read(offs_t offset) +{ + if (BIT(offset, 0)) + return status_r(); + else + return data_r(); +} + +void i8251_device::write(offs_t offset, uint8_t data) +{ + if (BIT(offset, 0)) + control_w(data); + else + data_w(data); +} + + WRITE_LINE_MEMBER(i8251_device::write_rxd) { m_rxd = state; @@ -723,13 +740,3 @@ READ_LINE_MEMBER(i8251_device::txrdy_r) { return is_tx_enabled() && (m_status & I8251_STATUS_TX_READY) != 0; } - -WRITE8_MEMBER(v53_scu_device::command_w) -{ - i8251_device::command_w(data); -} - -WRITE8_MEMBER(v53_scu_device::mode_w) -{ - i8251_device::mode_w(data); -} diff --git a/src/devices/machine/i8251.h b/src/devices/machine/i8251.h index 2cf0e67cea6..4a9f7bb3eba 100644 --- a/src/devices/machine/i8251.h +++ b/src/devices/machine/i8251.h @@ -38,10 +38,13 @@ public: auto txempty_handler() { return m_txempty_handler.bind(); } auto syndet_handler() { return m_syndet_handler.bind(); } - DECLARE_READ8_MEMBER(data_r); - DECLARE_WRITE8_MEMBER(data_w); - DECLARE_READ8_MEMBER(status_r); - DECLARE_WRITE8_MEMBER(control_w); + uint8_t data_r(); + void data_w(uint8_t data); + uint8_t status_r(); + void control_w(uint8_t data); + + uint8_t read(offs_t offset); + void write(offs_t offset, uint8_t data); DECLARE_WRITE_LINE_MEMBER( write_rxd ); DECLARE_WRITE_LINE_MEMBER( write_cts ); @@ -141,8 +144,8 @@ public: // construction/destruction v53_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - DECLARE_WRITE8_MEMBER(command_w); - DECLARE_WRITE8_MEMBER(mode_w); + void command_w(uint8_t data) { i8251_device::command_w(data); } + void mode_w(uint8_t data) { i8251_device::mode_w(data); } }; diff --git a/src/devices/machine/i8271.cpp b/src/devices/machine/i8271.cpp index 243a73b3c6e..bd374a6da6c 100644 --- a/src/devices/machine/i8271.cpp +++ b/src/devices/machine/i8271.cpp @@ -163,6 +163,24 @@ void i8271_device::set_rate(int rate) cur_rate = rate; } +READ8_MEMBER(i8271_device::read) +{ + switch(offset & 0x03) { + case 0x00: return sr_r(space, 0); + case 0x01: return rr_r(space, 0); + } + return 0xff; +} + +WRITE8_MEMBER(i8271_device::write) +{ + switch(offset & 0x03) { + case 0x00: cmd_w(space, 0, data); break; + case 0x01: param_w(space, 0, data); break; + case 0x02: reset_w(space, 0, data); break; + } +} + READ8_MEMBER(i8271_device::data_r) { set_drq(false); diff --git a/src/devices/machine/i8271.h b/src/devices/machine/i8271.h index 86a32365fc0..00342f38e4d 100644 --- a/src/devices/machine/i8271.h +++ b/src/devices/machine/i8271.h @@ -23,6 +23,8 @@ public: auto hdl_wr_callback() { return hdl_cb.bind(); } auto opt_wr_callback() { return opt_cb.bind(); } + DECLARE_READ8_MEMBER(read); + DECLARE_WRITE8_MEMBER(write); DECLARE_READ8_MEMBER (data_r); DECLARE_WRITE8_MEMBER(data_w); diff --git a/src/devices/machine/nscsi_bus.cpp b/src/devices/machine/nscsi_bus.cpp index f8be56e50a7..b8e2e878a52 100644 --- a/src/devices/machine/nscsi_bus.cpp +++ b/src/devices/machine/nscsi_bus.cpp @@ -6,8 +6,9 @@ #define LOG_GENERAL (1U << 0) #define LOG_STATE (1U << 1) #define LOG_CONTROL (1U << 2) +#define LOG_DATA (1U << 3) -//#define VERBOSE (LOG_GENERAL | LOG_STATE | LOG_CONTROL) +//#define VERBOSE (LOG_GENERAL | LOG_STATE | LOG_CONTROL | LOG_DATA) #define VERBOSE (LOG_GENERAL) #include "logmacro.h" @@ -465,6 +466,7 @@ uint8_t nscsi_full_device::scsi_get_data(int id, int pos) { switch(id) { case SBUF_MAIN: + LOGMASKED(LOG_DATA, "scsi_get_data MAIN, id:%d pos:%d data:%02x %c\n", id, pos, scsi_cmdbuf[pos], scsi_cmdbuf[pos] >= 0x20 && scsi_cmdbuf[pos] < 0x7f ? (char)scsi_cmdbuf[pos] : ' '); return scsi_cmdbuf[pos]; case SBUF_SENSE: return scsi_sense_buffer[pos]; @@ -477,6 +479,7 @@ void nscsi_full_device::scsi_put_data(int id, int pos, uint8_t data) { switch(id) { case SBUF_MAIN: + LOGMASKED(LOG_DATA, "nscsi_bus: scsi_put_data MAIN, id:%d pos:%d data:%02x %c\n", id, pos, data, data >= 0x20 && data < 0x7f ? (char)data : ' '); scsi_cmdbuf[pos] = data; break; case SBUF_SENSE: diff --git a/src/devices/machine/nscsi_hd.cpp b/src/devices/machine/nscsi_hd.cpp index cc6c9e2167c..15824d1679d 100644 --- a/src/devices/machine/nscsi_hd.cpp +++ b/src/devices/machine/nscsi_hd.cpp @@ -6,6 +6,7 @@ #define LOG_GENERAL (1U << 0) #define LOG_COMMAND (1U << 1) +#define LOG_DATA (1U << 2) #define VERBOSE (LOG_GENERAL) @@ -60,21 +61,30 @@ MACHINE_CONFIG_END uint8_t nscsi_harddisk_device::scsi_get_data(int id, int pos) { + uint8_t data = 0; if(id != 2) - return nscsi_full_device::scsi_get_data(id, pos); - int clba = lba + pos / bytes_per_sector; - if(clba != cur_lba) { - cur_lba = clba; - if(!hard_disk_read(harddisk, cur_lba, block)) { - LOG("HD READ ERROR !\n"); - memset(block, 0, sizeof(block)); + { + data = nscsi_full_device::scsi_get_data(id, pos); + } + else + { + int clba = lba + pos / bytes_per_sector; + if(clba != cur_lba) { + cur_lba = clba; + if(!hard_disk_read(harddisk, cur_lba, block)) { + LOG("HD READ ERROR !\n"); + memset(block, 0, sizeof(block)); + } } + data = block[pos % bytes_per_sector]; } - return block[pos % bytes_per_sector]; + LOGMASKED(LOG_DATA, "nscsi_hd: scsi_get_data, id:%d pos:%d data:%02x %c\n", id, pos, data, data >= 0x20 && data < 0x7f ? (char)data : ' '); + return data; } void nscsi_harddisk_device::scsi_put_data(int id, int pos, uint8_t data) { + LOGMASKED(LOG_DATA, "nscsi_hd: scsi_put_data, id:%d pos:%d data:%02x %c\n", id, pos, data, data >= 0x20 && data < 0x7f ? (char)data : ' '); if(id != 2) { nscsi_full_device::scsi_put_data(id, pos, data); return; @@ -328,7 +338,7 @@ void nscsi_harddisk_device::scsi_command() } case SC_START_STOP_UNIT: - LOG("command START STOP UNIT\n"); + LOG("command %s UNIT\n", (scsi_cmdbuf[4] & 0x1) ? "START" : "STOP"); scsi_status_complete(SS_GOOD); break; diff --git a/src/devices/machine/timekpr.cpp b/src/devices/machine/timekpr.cpp index aa7febbf9d4..c9db679e13c 100644 --- a/src/devices/machine/timekpr.cpp +++ b/src/devices/machine/timekpr.cpp @@ -18,6 +18,12 @@ #include "machine/timekpr.h" #include "machine/timehelp.h" +#define LOG_GENERAL (1U << 0) +#define LOG_TICKS (1U << 1) + +#define VERBOSE (0) +#include "logmacro.h" + // device type definition DEFINE_DEVICE_TYPE(M48T02, m48t02_device, "m48t02", "M48T02 Timekeeper") DEFINE_DEVICE_TYPE(M48T35, m48t35_device, "m48t35", "M48T35 Timekeeper") @@ -274,7 +280,7 @@ void timekeeper_device::counters_from_ram() void timekeeper_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - logerror("Tick\n"); + LOGMASKED(LOG_TICKS, "Tick\n"); if( ( m_seconds & SECONDS_ST ) != 0 || ( m_control & CONTROL_W ) != 0 ) { @@ -370,7 +376,7 @@ WRITE8_MEMBER(timekeeper_device::watchdog_write) WRITE8_MEMBER( timekeeper_device::write ) { - logerror("timekeeper_device::write: %04x = %02x\n", offset, data); + LOGMASKED(LOG_GENERAL, "timekeeper_device::write: %04x = %02x\n", offset, data); if( offset == m_offset_control ) { if( ( m_control & CONTROL_W ) != 0 && @@ -429,7 +435,7 @@ READ8_MEMBER( timekeeper_device::read ) m_reset_cb(CLEAR_LINE); m_irq_cb(CLEAR_LINE); } - logerror("timekeeper_device::read: %04x (%02x)\n", offset, result); + LOGMASKED(LOG_GENERAL, "timekeeper_device::read: %04x (%02x)\n", offset, result); return result; } diff --git a/src/devices/machine/tube.h b/src/devices/machine/tube.h index 17223d22f84..c8d94b1c7a7 100644 --- a/src/devices/machine/tube.h +++ b/src/devices/machine/tube.h @@ -14,27 +14,6 @@ //************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_TUBE_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, TUBE, 0); - -#define MCFG_TUBE_HIRQ_HANDLER(_devcb) \ - downcast<tube_device &>(*device).set_hirq_handler(DEVCB_##_devcb); - -#define MCFG_TUBE_PNMI_HANDLER(_devcb) \ - downcast<tube_device &>(*device).set_pnmi_handler(DEVCB_##_devcb); - -#define MCFG_TUBE_PIRQ_HANDLER(_devcb) \ - downcast<tube_device &>(*device).set_pirq_handler(DEVCB_##_devcb); - -#define MCFG_TUBE_DRQ_HANDLER(_devcb) \ - downcast<tube_device &>(*device).set_drq_handler(DEVCB_##_devcb); - - - -//************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -45,13 +24,9 @@ class tube_device : public device_t { public: // construction/destruction - tube_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + tube_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); // callbacks - template <class Object> devcb_base &set_hirq_handler(Object &&cb) { return m_hirq_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_pnmi_handler(Object &&cb) { return m_pnmi_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_pirq_handler(Object &&cb) { return m_pirq_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward<Object>(cb)); } auto hirq_handler() { return m_hirq_handler.bind(); } auto pnmi_handler() { return m_pnmi_handler.bind(); } auto pirq_handler() { return m_pirq_handler.bind(); } diff --git a/src/devices/sound/2608intf.cpp b/src/devices/sound/2608intf.cpp index 4dc5bedf02f..1445de91f37 100644 --- a/src/devices/sound/2608intf.cpp +++ b/src/devices/sound/2608intf.cpp @@ -85,8 +85,6 @@ void ym2608_device::device_start() ay8910_device::device_start(); int rate = clock()/72; - void *pcmbufa; - int pcmsizea; m_irq_handler.resolve(); @@ -96,14 +94,12 @@ void ym2608_device::device_start() /* stream system initialize */ m_stream = machine().sound().stream_alloc(*this,0,2,rate, stream_update_delegate(&ym2608_device::stream_generate,this)); - /* setup adpcm buffers */ - pcmbufa = m_region->base(); - pcmsizea = m_region->bytes(); /* initialize YM2608 */ m_chip = ym2608_init(this,clock(),rate, - pcmbufa,pcmsizea, - &ym2608_device::static_timer_handler,&ym2608_device::static_irq_handler,&psgintf); + &ym2608_device::static_internal_read_byte, + &ym2608_device::static_external_read_byte, &ym2608_device::static_external_write_byte, + &ym2608_device::static_timer_handler,&ym2608_device::static_irq_handler,&psgintf); assert_always(m_chip != nullptr, "Error creating YM2608 chip"); } @@ -135,6 +131,15 @@ void ym2608_device::device_reset() ym2608_reset_chip(m_chip); } +//------------------------------------------------- +// rom_bank_updated +//------------------------------------------------- + +void ym2608_device::rom_bank_updated() +{ + m_stream->update(); +} + READ8_MEMBER( ym2608_device::read ) { @@ -150,16 +155,17 @@ DEFINE_DEVICE_TYPE(YM2608, ym2608_device, "ym2608", "YM2608 OPNA") ym2608_device::ym2608_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : ay8910_device(mconfig, YM2608, tag, owner, clock, PSG_TYPE_YM, 1, 2) + , device_rom_interface(mconfig, *this, 21) , m_stream(nullptr) , m_timer{ nullptr, nullptr } , m_chip(nullptr) , m_irq_handler(*this) - , m_region(*this, DEVICE_SELF) + , m_internal(*this, "internal") { } ROM_START( ym2608 ) - ROM_REGION( 0x2000, "ym2608", 0 ) + ROM_REGION( 0x2000, "internal", 0 ) /* This data is derived from the chip's output - internal ROM can't be read. It was verified, using real YM2608, that this ADPCM stream produces 100% correct output signal. diff --git a/src/devices/sound/2608intf.h b/src/devices/sound/2608intf.h index d3ba76506ee..de64a23245b 100644 --- a/src/devices/sound/2608intf.h +++ b/src/devices/sound/2608intf.h @@ -14,7 +14,8 @@ struct ssg_callbacks; #define MCFG_YM2608_IRQ_HANDLER(cb) \ downcast<ym2608_device &>(*device).set_irq_handler(DEVCB_##cb); -class ym2608_device : public ay8910_device +class ym2608_device : public ay8910_device, + public device_rom_interface { public: ym2608_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -38,6 +39,8 @@ protected: virtual void device_stop() override; virtual void device_reset() override; + virtual void rom_bank_updated() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; void stream_generate(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); @@ -46,6 +49,10 @@ private: void timer_handler(int c, int count, int clock); void update_request() { m_stream->update(); } + static uint8_t static_external_read_byte(device_t *param, offs_t offset) { return downcast<ym2608_device *>(param)->read_byte(offset); } + static void static_external_write_byte(device_t *param, offs_t offset, uint8_t data) { return downcast<ym2608_device *>(param)->space().write_byte(offset, data); } + static uint8_t static_internal_read_byte(device_t *param, offs_t offset) { return downcast<ym2608_device *>(param)->m_internal->as_u8(offset % downcast<ym2608_device *>(param)->m_internal->bytes()); }; + static void static_irq_handler(device_t *param, int irq) { downcast<ym2608_device *>(param)->irq_handler(irq); } static void static_timer_handler(device_t *param, int c, int count, int clock) { downcast<ym2608_device *>(param)->timer_handler(c, count, clock); } @@ -54,7 +61,7 @@ private: emu_timer * m_timer[2]; void * m_chip; devcb_write_line m_irq_handler; - required_memory_region m_region; + required_memory_region m_internal; static const ssg_callbacks psgintf; }; diff --git a/src/devices/sound/2610intf.cpp b/src/devices/sound/2610intf.cpp index 6b2e2886d8c..84598507274 100644 --- a/src/devices/sound/2610intf.cpp +++ b/src/devices/sound/2610intf.cpp @@ -17,9 +17,6 @@ #include "2610intf.h" #include "fm.h" -char const *const ym2610_device::YM2610_TAG = "ymsnd"; -char const *const ym2610_device::YM2610_DELTAT_TAG = "ymsnd.deltat"; - const ssg_callbacks ym2610_device::psgintf = { &ym2610_device::psg_set_clock, @@ -107,24 +104,21 @@ void ym2610_device::device_start() /* stream system initialize */ m_stream = machine().sound().stream_alloc(*this,0,2,rate, stream_update_delegate(&ym2610_device::stream_generate,this)); - /* setup adpcm buffers */ - void *pcmbufa = m_region->base(); - int pcmsizea = m_region->bytes(); - - std::string name = tag() + std::string(".deltat"); - memory_region *deltat_region = machine().root_device().memregion(name.c_str()); - void *pcmbufb = pcmbufa; - int pcmsizeb = pcmsizea; - if (deltat_region != nullptr && deltat_region->base() != nullptr && deltat_region->bytes() != 0) + if (!has_configured_map(0) && !has_configured_map(1)) { - pcmbufb = deltat_region->base(); - pcmsizeb = deltat_region->bytes(); + if (m_adpcm_a_region) + space(0).install_rom(0, m_adpcm_a_region->bytes() - 1, m_adpcm_a_region->base()); + + if (m_adpcm_b_region) + space(1).install_rom(0, m_adpcm_b_region->bytes() - 1, m_adpcm_b_region->base()); + else if (m_adpcm_a_region) + space(1).install_rom(0, m_adpcm_a_region->bytes() - 1, m_adpcm_a_region->base()); } /**** initialize YM2610 ****/ - m_chip = ym2610_init(this,clock(),rate, - pcmbufa,pcmsizea,pcmbufb,pcmsizeb, - &ym2610_device::static_timer_handler,&ym2610_device::static_irq_handler,&psgintf); + m_chip = ym2610_init(this, clock(), rate, + &ym2610_device::static_adpcm_a_read_byte, &ym2610_device::static_adpcm_b_read_byte, + &ym2610_device::static_timer_handler, &ym2610_device::static_irq_handler, &psgintf); assert_always(m_chip != nullptr, "Error creating YM2610 chip"); } @@ -156,6 +150,19 @@ void ym2610_device::device_reset() ym2610_reset_chip(m_chip); } +//------------------------------------------------- +// memory_space_config - return a description of +// any address spaces owned by this device +//------------------------------------------------- + +device_memory_interface::space_config_vector ym2610_device::memory_space_config() const +{ + return space_config_vector{ + std::make_pair(0, &m_adpcm_a_config), + std::make_pair(1, &m_adpcm_b_config) + }; +} + READ8_MEMBER( ym2610_device::read ) { @@ -177,10 +184,15 @@ ym2610_device::ym2610_device(const machine_config &mconfig, const char *tag, dev ym2610_device::ym2610_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : ay8910_device(mconfig, type, tag, owner, clock, PSG_TYPE_YM, 1, 0) + , device_memory_interface(mconfig, *this) + , m_adpcm_a_config("adpcm-a", ENDIANNESS_LITTLE, 8, 24, 0) + , m_adpcm_b_config("adpcm-b", ENDIANNESS_LITTLE, 8, 24, 0) , m_stream(nullptr) , m_timer{ nullptr, nullptr } , m_irq_handler(*this) - , m_region(*this, DEVICE_SELF) + , m_adpcm_b_region_name("^" + std::string(basetag()) + ".deltat") + , m_adpcm_a_region(*this, DEVICE_SELF) + , m_adpcm_b_region(*this, m_adpcm_b_region_name.c_str()) { } diff --git a/src/devices/sound/2610intf.h b/src/devices/sound/2610intf.h index 583091a666b..9f9dc69c123 100644 --- a/src/devices/sound/2610intf.h +++ b/src/devices/sound/2610intf.h @@ -14,7 +14,8 @@ struct ssg_callbacks; #define MCFG_YM2610_IRQ_HANDLER(cb) \ downcast<ym2610_device &>(*device).set_irq_handler((DEVCB_##cb)); -class ym2610_device : public ay8910_device +class ym2610_device : public ay8910_device, + public device_memory_interface { public: ym2610_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -23,15 +24,14 @@ public: template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); } auto irq_handler() { return m_irq_handler.bind(); } + virtual space_config_vector memory_space_config() const override; + DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); // update request from fm.cpp static void update_request(device_t *param) { downcast<ym2610_device *>(param)->update_request(); } - static char const *const YM2610_TAG; - static char const *const YM2610_DELTAT_TAG; - protected: ym2610_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); @@ -53,14 +53,21 @@ private: void timer_handler(int c, int count, int clock); void update_request() { m_stream->update(); } + static uint8_t static_adpcm_a_read_byte(device_t *param, offs_t offset) { return downcast<ym2610_device *>(param)->space(0).read_byte(offset); } + static uint8_t static_adpcm_b_read_byte(device_t *param, offs_t offset) { return downcast<ym2610_device *>(param)->space(1).read_byte(offset); } + static void static_irq_handler(device_t *param, int irq) { downcast<ym2610_device *>(param)->irq_handler(irq); } static void static_timer_handler(device_t *param, int c, int count, int clock) { downcast<ym2610_device *>(param)->timer_handler(c, count, clock); } // internal state + const address_space_config m_adpcm_a_config; + const address_space_config m_adpcm_b_config; sound_stream * m_stream; emu_timer * m_timer[2]; devcb_write_line m_irq_handler; - required_memory_region m_region; + const std::string m_adpcm_b_region_name; + optional_memory_region m_adpcm_a_region; + optional_memory_region m_adpcm_b_region; static const ssg_callbacks psgintf; }; diff --git a/src/devices/sound/8950intf.cpp b/src/devices/sound/8950intf.cpp index da0049f0a91..f56f34c88f9 100644 --- a/src/devices/sound/8950intf.cpp +++ b/src/devices/sound/8950intf.cpp @@ -84,7 +84,7 @@ void y8950_device::device_start() assert_always(m_chip != nullptr, "Error creating Y8950 chip"); /* ADPCM ROM data */ - y8950_set_delta_t_memory(m_chip, m_region->base(), m_region->bytes()); + y8950_set_delta_t_memory(m_chip, &y8950_device::static_read_byte, &y8950_device::static_write_byte); m_stream = machine().sound().stream_alloc(*this,0,1,rate); /* port and keyboard handler */ @@ -128,6 +128,15 @@ void y8950_device::device_reset() y8950_reset_chip(m_chip); } +//------------------------------------------------- +// rom_bank_updated +//------------------------------------------------- + +void y8950_device::rom_bank_updated() +{ + m_stream->update(); +} + READ8_MEMBER( y8950_device::read ) { @@ -150,6 +159,7 @@ DEFINE_DEVICE_TYPE(Y8950, y8950_device, "y8950", "Y8950 MSX-Audio") y8950_device::y8950_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, Y8950, tag, owner, clock) , device_sound_interface(mconfig, *this) + , device_rom_interface(mconfig, *this, 21) , m_stream(nullptr) , m_timer{ nullptr, nullptr } , m_chip(nullptr) @@ -158,6 +168,5 @@ y8950_device::y8950_device(const machine_config &mconfig, const char *tag, devic , m_keyboard_write_handler(*this) , m_io_read_handler(*this) , m_io_write_handler(*this) - , m_region(*this, DEVICE_SELF) { } diff --git a/src/devices/sound/8950intf.h b/src/devices/sound/8950intf.h index c1f3163a9ee..258e27ccdb2 100644 --- a/src/devices/sound/8950intf.h +++ b/src/devices/sound/8950intf.h @@ -21,7 +21,9 @@ #define MCFG_Y8950_IO_WRITE_HANDLER(cb) \ downcast<y8950_device &>(*device).set_io_write_handler((DEVCB_##cb)); -class y8950_device : public device_t, public device_sound_interface +class y8950_device : public device_t, + public device_sound_interface, + public device_rom_interface { public: y8950_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -48,6 +50,8 @@ protected: virtual void device_stop() override; virtual void device_reset() override; + virtual void rom_bank_updated() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; // sound stream update overrides @@ -63,6 +67,9 @@ private: unsigned char keyboard_handler_r() { return m_keyboard_read_handler(0); } void keyboard_handler_w(unsigned char data) { m_keyboard_write_handler(offs_t(0), data); } + static uint8_t static_read_byte(device_t *param, offs_t offset) { return downcast<y8950_device *>(param)->read_byte(offset); } + static void static_write_byte(device_t *param, offs_t offset, uint8_t data) { return downcast<y8950_device *>(param)->space().write_byte(offset, data); } + static void static_irq_handler(device_t *param, int irq) { downcast<y8950_device *>(param)->irq_handler(irq); } static void static_timer_handler(device_t *param, int c, const attotime &period) { downcast<y8950_device *>(param)->timer_handler(c, period); } static void static_update_request(device_t *param, int interval) { downcast<y8950_device *>(param)->update_request(); } @@ -81,7 +88,6 @@ private: devcb_write8 m_keyboard_write_handler; devcb_read8 m_io_read_handler; devcb_write8 m_io_write_handler; - required_memory_region m_region; }; DECLARE_DEVICE_TYPE(Y8950, y8950_device) diff --git a/src/devices/sound/fm.cpp b/src/devices/sound/fm.cpp index e93d009f65f..8f679e99357 100644 --- a/src/devices/sound/fm.cpp +++ b/src/devices/sound/fm.cpp @@ -2441,8 +2441,7 @@ struct ym2610_state uint8_t addr_A1; /* address line A1 */ /* ADPCM-A unit */ - const uint8_t *pcmbuf; /* pcm rom buffer */ - uint32_t pcm_size; /* size of pcm rom */ + FM_READBYTE read_byte; uint8_t adpcmTL; /* adpcmA total level */ ADPCM_CH adpcm[6]; /* adpcm channels */ uint32_t adpcmreg[0x30]; /* registers */ @@ -2492,7 +2491,7 @@ struct ym2610_state data = ch->now_data & 0x0f; else { - ch->now_data = *(pcmbuf+(ch->now_addr>>1)); + ch->now_data = read_byte(device, ch->now_addr>>1); data = (ch->now_data >> 4) & 0x0f; } @@ -2543,25 +2542,6 @@ struct ym2610_state adpcm[c].adpcm_step= 0; adpcm[c].adpcm_out = 0; adpcm[c].flag = 1; - - if(pcmbuf==nullptr) - { /* Check ROM Mapped */ - device->logerror("YM2608-YM2610: ADPCM-A rom not mapped\n"); - adpcm[c].flag = 0; - } - else - { - if(adpcm[c].end >= pcm_size) - { /* Check End in Range */ - device->logerror("YM2610: ADPCM-A end out of range: $%08x\n",adpcm[c].end); - /*adpcm[c].end = pcm_size-1;*/ /* JB: DO NOT uncomment this, otherwise you will break the comparison in the ADPCM_CALC_CHA() */ - } - if(adpcm[c].start >= pcm_size) /* Check Start in Range */ - { - device->logerror("YM2608-YM2610: ADPCM-A start out of range: $%08x\n",adpcm[c].start); - adpcm[c].flag = 0; - } - } } } } @@ -2959,8 +2939,10 @@ static void YM2608_deltat_status_reset(void *chip, uint8_t changebits) FM_STATUS_RESET(&(F2608->OPN.ST), changebits); } /* YM2608(OPNA) */ -void * ym2608_init(device_t *device, int clock, int rate, void *pcmrom,int pcmsize, - FM_TIMERHANDLER timer_handler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg) +void * ym2608_init(device_t *device, int clock, int rate, + FM_READBYTE InternalReadByte, + FM_READBYTE ExternalReadByte, FM_WRITEBYTE ExternalWriteByte, + FM_TIMERHANDLER timer_handler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg) { ym2608_state *F2608; @@ -2986,8 +2968,8 @@ void * ym2608_init(device_t *device, int clock, int rate, void *pcmrom,int pcmsi F2608->OPN.ST.SSG = ssg; /* DELTA-T */ - F2608->deltaT.memory = (uint8_t *)pcmrom; - F2608->deltaT.memory_size = pcmsize; + F2608->deltaT.read_byte = ExternalReadByte; + F2608->deltaT.write_byte = ExternalWriteByte; /*F2608->deltaT.write_time = 20.0 / clock;*/ /* a single byte write takes 20 cycles of main clock */ /*F2608->deltaT.read_time = 18.0 / clock;*/ /* a single byte read takes 18 cycles of main clock */ @@ -3000,8 +2982,7 @@ void * ym2608_init(device_t *device, int clock, int rate, void *pcmrom,int pcmsi F2608->deltaT.status_change_ZERO_bit = 0x10; /* status flag: set bit4 if silence continues for more than 290 milliseconds while recording the ADPCM */ /* ADPCM Rhythm */ - F2608->pcmbuf = device->memregion("ym2608")->base(); - F2608->pcm_size = 0x2000; + F2608->read_byte = InternalReadByte; Init_ADPCMATable(); @@ -3646,9 +3627,9 @@ static void YM2610_deltat_status_reset(void *chip, uint8_t changebits) F2610->adpcm_arrivedEndAddress &= (~changebits); } -void *ym2610_init(device_t *device, int clock, int rate, void *pcmroma,int pcmsizea,void *pcmromb,int pcmsizeb, - FM_TIMERHANDLER timer_handler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg) - +void *ym2610_init(device_t *device, int clock, int rate, + FM_READBYTE adpcm_a_read_byte, FM_READBYTE adpcm_b_read_byte, + FM_TIMERHANDLER timer_handler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg) { ym2610_state *F2610; @@ -3673,11 +3654,10 @@ void *ym2610_init(device_t *device, int clock, int rate, void *pcmroma,int pcmsi F2610->OPN.ST.IRQ_Handler = IRQHandler; F2610->OPN.ST.SSG = ssg; /* ADPCM */ - F2610->pcmbuf = (const uint8_t *)pcmroma; - F2610->pcm_size = pcmsizea; + F2610->read_byte = adpcm_a_read_byte; /* DELTA-T */ - F2610->deltaT.memory = (uint8_t *)pcmromb; - F2610->deltaT.memory_size = pcmsizeb; + F2610->deltaT.read_byte = adpcm_b_read_byte; + F2610->deltaT.write_byte = nullptr; F2610->deltaT.status_set_handler = YM2610_deltat_status_set; F2610->deltaT.status_reset_handler = YM2610_deltat_status_reset; @@ -3719,26 +3699,6 @@ void ym2610_reset_chip(void *chip) device_t* dev = F2610->OPN.ST.device; std::string name(dev->tag()); - /* setup PCM buffers again */ - F2610->pcmbuf = (const uint8_t *)dev->machine().root_device().memregion(name.c_str())->base(); - F2610->pcm_size = dev->machine().root_device().memregion(name.c_str())->bytes(); - name.append(".deltat"); - memory_region *deltat_region = dev->machine().root_device().memregion(name.c_str()); - F2610->deltaT.memory = nullptr; - if (deltat_region != nullptr) - { - F2610->deltaT.memory = (uint8_t *)dev->machine().root_device().memregion(name.c_str())->base(); - } - if(F2610->deltaT.memory == nullptr) - { - F2610->deltaT.memory = (uint8_t*)F2610->pcmbuf; - F2610->deltaT.memory_size = F2610->pcm_size; - } - else - { - F2610->deltaT.memory_size = dev->machine().root_device().memregion(name.c_str())->bytes(); - } - /* Reset Prescaler */ OPNSetPres( OPN, 6*24, 6*24, 4*2); /* OPN 1/6 , SSG 1/4 */ /* reset SSG section */ diff --git a/src/devices/sound/fm.h b/src/devices/sound/fm.h index 7b919ea7402..50b6b0d3d99 100644 --- a/src/devices/sound/fm.h +++ b/src/devices/sound/fm.h @@ -60,6 +60,8 @@ typedef unsigned char FMSAMPLE; #endif */ +typedef uint8_t (*FM_READBYTE)(device_t *device, offs_t offset); +typedef void(*FM_WRITEBYTE)(device_t *device, offs_t offset, uint8_t data); typedef void (*FM_TIMERHANDLER)(device_t *device,int c,int cnt,int clock); typedef void (*FM_IRQHANDLER)(device_t *device,int irq); /* FM_TIMERHANDLER : Stop or Start timer */ @@ -134,8 +136,9 @@ void ym2203_postload(void *chip); #if BUILD_YM2608 /* -------------------- YM2608(OPNA) Interface -------------------- */ void * ym2608_init(device_t *device, int baseclock, int rate, - void *pcmroma,int pcmsizea, - FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg); + FM_READBYTE InternalReadByte, + FM_READBYTE ExternalReadByte, FM_WRITEBYTE ExternalWriteByte, + FM_TIMERHANDLER TimerHandler, FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg); void ym2608_clock_changed(void *chip, int clock, int rate); void ym2608_shutdown(void *chip); void ym2608_reset_chip(void *chip); @@ -150,8 +153,8 @@ void ym2608_postload(void *chip); #if (BUILD_YM2610||BUILD_YM2610B) /* -------------------- YM2610(OPNB) Interface -------------------- */ void * ym2610_init(device_t *device, int baseclock, int rate, - void *pcmroma,int pcmasize,void *pcmromb,int pcmbsize, - FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg); + FM_READBYTE adpcm_a_read_byte, FM_READBYTE adpcm_b_read_byte, + FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg); void ym2610_clock_changed(void *chip, int clock, int rate); void ym2610_shutdown(void *chip); void ym2610_reset_chip(void *chip); diff --git a/src/devices/sound/fmopl.cpp b/src/devices/sound/fmopl.cpp index c7390842710..99139310d69 100644 --- a/src/devices/sound/fmopl.cpp +++ b/src/devices/sound/fmopl.cpp @@ -70,8 +70,8 @@ Revision History: */ #include "emu.h" -#include "ymdeltat.h" #include "fmopl.h" +#include "ymdeltat.h" @@ -2477,11 +2477,11 @@ void y8950_set_update_handler(void *chip,OPL_UPDATEHANDLER UpdateHandler,device_ reinterpret_cast<FM_OPL *>(chip)->SetUpdateHandler(UpdateHandler, device); } -void y8950_set_delta_t_memory(void *chip, void * deltat_mem_ptr, int deltat_mem_size ) +void y8950_set_delta_t_memory(void *chip, FM_READBYTE read_byte, FM_WRITEBYTE write_byte) { FM_OPL *OPL = (FM_OPL *)chip; - OPL->deltat->memory = (uint8_t *)(deltat_mem_ptr); - OPL->deltat->memory_size = deltat_mem_size; + OPL->deltat->read_byte = read_byte; + OPL->deltat->write_byte = write_byte; } /* diff --git a/src/devices/sound/fmopl.h b/src/devices/sound/fmopl.h index 5da3f110830..add973a2369 100644 --- a/src/devices/sound/fmopl.h +++ b/src/devices/sound/fmopl.h @@ -26,6 +26,8 @@ typedef int8_t OPLSAMPLE; #endif */ +typedef uint8_t (*FM_READBYTE)(device_t *device, offs_t offset); +typedef void(*FM_WRITEBYTE)(device_t *device, offs_t offset, uint8_t data); typedef void (*OPL_TIMERHANDLER)(device_t *device,int timer,const attotime &period); typedef void (*OPL_IRQHANDLER)(device_t *device,int irq); typedef void (*OPL_UPDATEHANDLER)(device_t *device,int min_interval_us); @@ -89,7 +91,7 @@ void ym3526_set_update_handler(void *chip, OPL_UPDATEHANDLER UpdateHandler, devi /* Y8950 port handlers */ void y8950_set_port_handler(void *chip, OPL_PORTHANDLER_W PortHandler_w, OPL_PORTHANDLER_R PortHandler_r, device_t *device); void y8950_set_keyboard_handler(void *chip, OPL_PORTHANDLER_W KeyboardHandler_w, OPL_PORTHANDLER_R KeyboardHandler_r, device_t *device); -void y8950_set_delta_t_memory(void *chip, void * deltat_mem_ptr, int deltat_mem_size ); +void y8950_set_delta_t_memory(void *chip, FM_READBYTE read_byte, FM_WRITEBYTE write_byte); void * y8950_init(device_t *device, uint32_t clock, uint32_t rate); void y8950_clock_changed(void *chip, uint32_t clock, uint32_t rate); diff --git a/src/devices/sound/ymdeltat.cpp b/src/devices/sound/ymdeltat.cpp index 29e05b4ef9e..ea13da9782b 100644 --- a/src/devices/sound/ymdeltat.cpp +++ b/src/devices/sound/ymdeltat.cpp @@ -121,7 +121,7 @@ uint8_t YM_DELTAT::ADPCM_Read() if (now_addr != (end << 1)) { - v = memory[now_addr>>1]; + v = read_byte(device, now_addr>>1); /*logerror("YM Delta-T memory read $%08x, v=$%02x\n", now_addr >> 1, v);*/ @@ -200,6 +200,7 @@ value: START, REC, MEMDAT, REPEAT, SPOFF, x,x,RESET meaning: if (emulation_mode == EMULATION_MODE_YM2610) { v |= 0x20; /* YM2610 always uses external memory and doesn't even have memory flag bit. */ + v &= ~0x40; /* YM2610 has no rec bit */ } portstate = v & (0x80|0x40|0x20|0x10|0x01); /* start, rec, memory mode, repeat flag copy, reset(bit0) */ @@ -223,28 +224,6 @@ value: START, REC, MEMDAT, REPEAT, SPOFF, x,x,RESET meaning: { now_addr = start << 1; memread = 2; /* two dummy reads needed before accesing external memory via register $08*/ - - /* if yes, then let's check if ADPCM memory is mapped and big enough */ - if (!memory) - { - device->logerror("YM Delta-T ADPCM rom not mapped\n"); - portstate = 0x00; - PCM_BSY = 0; - } - else - { - if (end >= memory_size) /* Check End in Range */ - { - device->logerror("YM Delta-T ADPCM end out of range: $%08x\n", end); - end = memory_size - 1; - } - if (start >= memory_size) /* Check Start in Range */ - { - device->logerror("YM Delta-T ADPCM start out of range: $%08x\n", start); - portstate = 0x00; - PCM_BSY = 0; - } - } } else /* we access CPU memory (ADPCM data register $08) so we only reset now_addr here */ { @@ -340,7 +319,7 @@ value: START, REC, MEMDAT, REPEAT, SPOFF, x,x,RESET meaning: if (now_addr != (end << 1)) { - memory[now_addr >> 1] = v; + write_byte(device, now_addr >> 1, v); now_addr += 2; /* two nybbles at a time */ /* reset BRDY bit in status register, which means we are processing the write */ @@ -450,8 +429,7 @@ void YM_DELTAT::postload(uint8_t *regs) reg[0] = regs[0]; /* current rom data */ - if (memory) - now_data = *(memory + (now_addr >> 1)); + now_data = read_byte(device, now_addr >> 1); } void YM_DELTAT::savestate(device_t *device) @@ -515,7 +493,7 @@ static inline void YM_DELTAT_synthesis_from_external_memory(YM_DELTAT *DELTAT) if( DELTAT->now_addr&1 ) data = DELTAT->now_data & 0x0f; else { - DELTAT->now_data = *(DELTAT->memory + (DELTAT->now_addr>>1)); + DELTAT->now_data = DELTAT->read_byte(DELTAT->device, DELTAT->now_addr>>1); data = DELTAT->now_data >> 4; } diff --git a/src/devices/sound/ymdeltat.h b/src/devices/sound/ymdeltat.h index f52bd46f5cb..def88c712b9 100644 --- a/src/devices/sound/ymdeltat.h +++ b/src/devices/sound/ymdeltat.h @@ -6,6 +6,8 @@ #pragma once +typedef uint8_t (*FM_READBYTE)(device_t *device, offs_t offset); +typedef void (*FM_WRITEBYTE)(device_t *device, offs_t offset, uint8_t data); typedef void (*STATUS_CHANGE_HANDLER)(void *chip, uint8_t status_bits); @@ -14,7 +16,8 @@ struct YM_DELTAT { /* AT: rearranged and tightened structure */ static constexpr int EMULATION_MODE_NORMAL = 0; static constexpr int EMULATION_MODE_YM2610 = 1; - uint8_t *memory; + FM_READBYTE read_byte; + FM_WRITEBYTE write_byte; int32_t *output_pointer;/* pointer of output pointers */ int32_t *pan; /* pan : &output_pointer[pan] */ double freqbase; diff --git a/src/devices/video/scn2674.cpp b/src/devices/video/scn2674.cpp index 3058e110846..67a5fe19f94 100644 --- a/src/devices/video/scn2674.cpp +++ b/src/devices/video/scn2674.cpp @@ -601,7 +601,13 @@ void scn2674_device::write_interrupt_mask(bool enabled, uint8_t bits) if (BIT(changed_bits, 3)) LOGMASKED(LOG_INTR, "Line Zero IRQ %s\n", enabled ? "enabled" : "disabled"); if (BIT(changed_bits, 4)) + { LOGMASKED(LOG_INTR, "V-Blank IRQ %s\n", enabled ? "enabled" : "disabled"); + + // hack to allow PC-X to get its first interrupt + if (BIT(bits, 4) && !m_display_enabled) + recompute_parameters(); + } } void scn2674_device::write_delayed_command(uint8_t data) @@ -919,9 +925,10 @@ WRITE8_MEMBER( scn2674_device::write ) void scn2674_device::recompute_parameters() { - int horiz_pix_total = ((m_equalizing_constant + (m_horz_sync_width << 1)) << 1) * m_hpixels_per_column; + int horiz_chars_total = (m_equalizing_constant + (m_horz_sync_width << 1)) << 1; + int horiz_pix_total = horiz_chars_total * m_hpixels_per_column; int vert_pix_total = m_rows_per_screen * m_scanline_per_char_row + m_vert_front_porch + m_vert_back_porch + m_vsync_width; - attoseconds_t refresh = screen().frame_period().attoseconds(); + attoseconds_t refresh = screen().frame_period().as_attoseconds(); int max_visible_x = (m_character_per_row * m_hpixels_per_column) - 1; int max_visible_y = (m_rows_per_screen * m_scanline_per_char_row) - 1; @@ -931,10 +938,10 @@ void scn2674_device::recompute_parameters() return; } - LOGMASKED(LOG_IR, "width %u height %u max_x %u max_y %u refresh %f\n", horiz_pix_total, vert_pix_total, max_visible_x, max_visible_y, 1 / ATTOSECONDS_TO_DOUBLE(refresh)); + //attoseconds_t refresh = clocks_to_attotime(horiz_chars_total * vert_pix_total).as_attoseconds(); + LOGMASKED(LOG_IR, "width %u height %u max_x %u max_y %u refresh %f\n", horiz_pix_total, vert_pix_total, max_visible_x, max_visible_y, ATTOSECONDS_TO_HZ(refresh)); - rectangle visarea; - visarea.set(0, max_visible_x, 0, max_visible_y); + rectangle visarea(0, max_visible_x, 0, max_visible_y); screen().configure(horiz_pix_total, vert_pix_total, visarea, refresh); m_scanline_timer->adjust(screen().time_until_pos(0, 0), 0, screen().scan_period()); diff --git a/src/emu/diserial.h b/src/emu/diserial.h index af55c7d4bc5..e1e2a447dff 100644 --- a/src/emu/diserial.h +++ b/src/emu/diserial.h @@ -188,6 +188,16 @@ class device_buffered_serial_interface : public device_serial_interface protected: using device_serial_interface::device_serial_interface; + void interface_post_start() override + { + device_serial_interface::interface_post_start(); + + device().save_item(NAME(m_fifo)); + device().save_item(NAME(m_head)); + device().save_item(NAME(m_tail)); + device().save_item(NAME(m_empty)); + } + virtual void tra_complete() override { assert(!m_empty || (m_head == m_tail)); @@ -236,20 +246,14 @@ protected: } } - bool fifo_full() const + bool fifo_empty() const { - return !m_empty && (m_head == m_tail); + return m_empty; } -protected: - void interface_post_start() override + bool fifo_full() const { - device_serial_interface::interface_post_start(); - - device().save_item(NAME(m_fifo)); - device().save_item(NAME(m_head)); - device().save_item(NAME(m_tail)); - device().save_item(NAME(m_empty)); + return !m_empty && (m_head == m_tail); } private: diff --git a/src/emu/render.cpp b/src/emu/render.cpp index e3071d5f9f4..d6828cce124 100644 --- a/src/emu/render.cpp +++ b/src/emu/render.cpp @@ -1728,15 +1728,6 @@ void render_target::load_additional_layout_files(const char *basename, bool have screen_device_iterator iter(m_manager.machine().root_device()); std::vector<screen_info> const screens(std::begin(iter), std::end(iter)); - if (!have_default && !have_artwork) - { - if (screens.size() == 2U) - { - load_layout_file(nullptr, layout_dualhsxs); - if (m_filelist.empty()) - throw emu_fatalerror("Couldn't parse default layout??"); - } - } if (screens.empty()) // ensure the fallback view for systems with no screens is loaded if necessary { @@ -1945,6 +1936,47 @@ void render_target::load_additional_layout_files(const char *basename, bool have generate_view("Top-to-Bottom", 1U, false, [] (unsigned x, unsigned y) { return y; }); generate_view("Top-to-Bottom (Gapless)", 1U, true, [] (unsigned x, unsigned y) { return y; }); + // generate fake cocktail view for systems with two screens + if (screens.size() == 2U) + { + float const height0(float(screens[0].physical_y()) / screens[0].physical_x()); + float const height1(float(screens[1].physical_y()) / screens[1].physical_x()); + float const minor((std::max)((std::min)(height0, 1.0F), (std::min)(height1, 1.0F))); + + util::xml::data_node *const viewnode(layoutnode->add_child("view", nullptr)); + if (!viewnode) + throw emu_fatalerror("Couldn't create XML node??"); + viewnode->set_attribute("name", "Cocktail"); + + util::xml::data_node *const mirrornode(viewnode->add_child("screen", nullptr)); + if (!mirrornode) + throw emu_fatalerror("Couldn't create XML node??"); + mirrornode->set_attribute_int("index", 1); + util::xml::data_node *const mirrorbounds(mirrornode->add_child("bounds", nullptr)); + if (!mirrorbounds) + throw emu_fatalerror("Couldn't create XML node??"); + mirrorbounds->set_attribute_int("x", 0); + mirrorbounds->set_attribute_float("y", (-0.01 * minor) - height1); + mirrorbounds->set_attribute_int("width", 1); + mirrorbounds->set_attribute_float("height", height1); + util::xml::data_node *const flipper(mirrornode->add_child("orientation", nullptr)); + if (!flipper) + throw emu_fatalerror("Couldn't create XML node??"); + flipper->set_attribute_int("rotate", 180); + + util::xml::data_node *const screennode(viewnode->add_child("screen", nullptr)); + if (!screennode) + throw emu_fatalerror("Couldn't create XML node??"); + screennode->set_attribute_int("index", 0); + util::xml::data_node *const screenbounds(screennode->add_child("bounds", nullptr)); + if (!screenbounds) + throw emu_fatalerror("Couldn't create XML node??"); + screenbounds->set_attribute_int("x", 0); + screenbounds->set_attribute_int("y", 0); + screenbounds->set_attribute_int("width", 1); + screenbounds->set_attribute_float("height", height0); + } + // generate tiled views for (unsigned mindim = 2; ((screens.size() + mindim - 1) / mindim) >= mindim; ++mindim) { diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp index 85f064dcddf..f4a2915bc7c 100644 --- a/src/emu/xtal.cpp +++ b/src/emu/xtal.cpp @@ -235,6 +235,7 @@ const double XTAL::known_xtals[] = { 18'869'600, /* 18.8696_MHz_XTAL Memorex 2178 */ 19'339'600, /* 19.3396_MHz_XTAL TeleVideo TVI-955 80-column display clock */ 19'600'000, /* 19.6_MHz_XTAL Universal Mr. Do - Model 8021 PCB */ + 19'602'000, /* 19.602_MHz_XTAL Ampex 210+ 80-column display clock */ 19'660'800, /* 19.6608_MHz_XTAL Euro League (bootleg), labeled as "UKI 19.6608 20PF" */ 19'661'400, /* 19.6614_MHz_XTAL Wyse WY-30 */ 19'923'000, /* 19.923_MHz_XTAL Cinematronics vectors */ @@ -304,6 +305,7 @@ const double XTAL::known_xtals[] = { 31'684'000, /* 31.684_MHz_XTAL TeleVideo TVI-955 132-column display clock */ 31'948'800, /* 31.9488_MHz_XTAL NEC PC-88xx, PC-98xx */ 32'000'000, /* 32_MHz_XTAL - */ + 32'147'000, /* 32.147_MHz_XTAL Ampex 210+ 132-column display clock */ 32'220'000, /* 32.22_MHz_XTAL Typically used on 90's Data East PCBs (close to 9x NTSC subcarrier which is 32.215905Mhz */ 32'317'400, /* 32.3174_MHz_XTAL DEC VT330, VT340 */ 32'530'400, /* 32.5304_MHz_XTAL Seta 2 */ diff --git a/src/lib/formats/acorn_dsk.cpp b/src/lib/formats/acorn_dsk.cpp index 59261f9b4d5..d8992b9ad5a 100644 --- a/src/lib/formats/acorn_dsk.cpp +++ b/src/lib/formats/acorn_dsk.cpp @@ -127,6 +127,10 @@ const acorn_ssd_format::format acorn_ssd_format::formats[] = floppy_image::FF_35, floppy_image::DSDD, floppy_image::FM, 4000, 10, 80, 2, 256,{}, 0,{}, 40, 10, 10 }, + { // 100k 40 track single sided single density + floppy_image::FF_3, floppy_image::SSSD, floppy_image::FM, + 4000, 10, 40, 1, 256,{}, 0,{}, 40, 10, 10 + }, {} }; diff --git a/src/mame/audio/dsbz80.cpp b/src/mame/audio/dsbz80.cpp index c521ac825b6..a55613566cd 100644 --- a/src/mame/audio/dsbz80.cpp +++ b/src/mame/audio/dsbz80.cpp @@ -29,8 +29,7 @@ void dsbz80_device::dsbz80io_map(address_map &map) map(0xe5, 0xe7).w(FUNC(dsbz80_device::mpeg_end_w)); map(0xe8, 0xe8).w(FUNC(dsbz80_device::mpeg_volume_w)); map(0xe9, 0xe9).w(FUNC(dsbz80_device::mpeg_stereo_w)); - map(0xf0, 0xf0).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf1, 0xf1).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf0, 0xf1).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); } diff --git a/src/mame/audio/segam1audio.cpp b/src/mame/audio/segam1audio.cpp index 4638106761a..1dd071940b1 100644 --- a/src/mame/audio/segam1audio.cpp +++ b/src/mame/audio/segam1audio.cpp @@ -26,8 +26,7 @@ void segam1audio_device::segam1audio_map(address_map &map) { map(0x000000, 0x03ffff).rom(); map(0x080000, 0x09ffff).rom().region(M68000_TAG, 0x20000); // mirror of upper ROM socket - map(0xc20001, 0xc20001).rw(UART_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xc20003, 0xc20003).rw(UART_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xc20000, 0xc20003).rw(UART_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0xc40000, 0xc40007).rw(MULTIPCM_1_TAG, FUNC(multipcm_device::read), FUNC(multipcm_device::write)).umask16(0x00ff); map(0xc40012, 0xc40013).nopw(); map(0xc50000, 0xc50001).w(FUNC(segam1audio_device::m1_snd_mpcm_bnk1_w)); diff --git a/src/mame/drivers/a7150.cpp b/src/mame/drivers/a7150.cpp index ff46df7a1d8..ef44b6550a8 100644 --- a/src/mame/drivers/a7150.cpp +++ b/src/mame/drivers/a7150.cpp @@ -327,8 +327,7 @@ void a7150_state::a7150_io(address_map &map) map(0x00c0, 0x00c3).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); map(0x00c8, 0x00cf).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); map(0x00d0, 0x00d7).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); - map(0x00d8, 0x00d8).rw(m_uart8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x00da, 0x00da).rw(m_uart8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x00d8, 0x00db).rw(m_uart8251, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0x0200, 0x0203).rw(FUNC(a7150_state::a7150_kgs_r), FUNC(a7150_state::a7150_kgs_w)).umask16(0x00ff); // ABS/KGS board map(0x0300, 0x031f).unmaprw(); // ASP board #1 map(0x0320, 0x033f).unmaprw(); // ASP board #2 diff --git a/src/mame/drivers/alphatpx.cpp b/src/mame/drivers/alphatpx.cpp index 71225a67d7e..6376b1b318a 100644 --- a/src/mame/drivers/alphatpx.cpp +++ b/src/mame/drivers/alphatpx.cpp @@ -269,8 +269,7 @@ void alphatp_12_state::alphatp2_map(address_map &map) void alphatp_12_state::alphatp2_io(address_map &map) { map.unmap_value_high(); - map(0x04, 0x04).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x05, 0x05).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x04, 0x05).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x10, 0x11).rw(m_kbdmcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w)); map(0x12, 0x12).w(FUNC(alphatp_12_state::beep_w)); map(0x50, 0x53).rw(FUNC(alphatp_12_state::fdc_r), FUNC(alphatp_12_state::fdc_w)); @@ -309,8 +308,7 @@ void alphatp_34_state::alphatp3_io(address_map &map) { map.unmap_value_high(); //AM_RANGE(0x00, 0x00) AM_READ // unknown - map(0x04, 0x04).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x05, 0x05).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x04, 0x05).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x08, 0x09).rw(FUNC(alphatp_34_state::comm88_r), FUNC(alphatp_34_state::comm88_w)); map(0x10, 0x11).rw(m_kbdmcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w)); map(0x12, 0x12).w(FUNC(alphatp_34_state::beep_w)); diff --git a/src/mame/drivers/alphatro.cpp b/src/mame/drivers/alphatro.cpp index 7e69c57b949..09b1e263844 100644 --- a/src/mame/drivers/alphatro.cpp +++ b/src/mame/drivers/alphatro.cpp @@ -438,8 +438,7 @@ void alphatro_state::alphatro_io(address_map &map) map(0x2b, 0x2b).portr("XB"); map(0x30, 0x30).rw(FUNC(alphatro_state::port30_r), FUNC(alphatro_state::port30_w)); // USART for cassette reading and writing - map(0x40, 0x40).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x41, 0x41).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x40, 0x41).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); // CRTC - HD46505 / HD6845SP map(0x50, 0x50).w(m_crtc, FUNC(mc6845_device::address_w)); map(0x51, 0x51).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); diff --git a/src/mame/drivers/ampex210.cpp b/src/mame/drivers/ampex210.cpp index 62a576a9594..6f9c0152eea 100644 --- a/src/mame/drivers/ampex210.cpp +++ b/src/mame/drivers/ampex210.cpp @@ -9,6 +9,7 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "machine/mos6551.h" +#include "machine/nvram.h" #include "video/scn2674.h" #include "screen.h" @@ -29,6 +30,8 @@ private: void mem_map(address_map &map); void io_map(address_map &map); + void vram_map(address_map &map); + required_device<cpu_device> m_maincpu; required_region_ptr<u8> m_chargen; }; @@ -41,7 +44,7 @@ SCN2672_DRAW_CHARACTER_MEMBER(ampex210_state::draw_character) void ampex210_state::mem_map(address_map &map) { map(0x0000, 0x7fff).rom().region("maincpu", 0); - map(0x8000, 0x87ff).ram(); + map(0x8000, 0x87ff).ram().share("nvram"); map(0x8800, 0x9fff).ram(); } @@ -51,6 +54,14 @@ void ampex210_state::io_map(address_map &map) map(0x00, 0x07).rw("pvtc", FUNC(scn2672_device::read), FUNC(scn2672_device::write)); map(0x44, 0x47).rw("acia", FUNC(mos6551_device::read), FUNC(mos6551_device::write)); map(0x80, 0x80).nopw(); + map(0xc0, 0xc0).w("pvtc", FUNC(scn2672_device::buffer_w)); + map(0xc1, 0xc1).r("pvtc", FUNC(scn2672_device::buffer_r)); + map(0xc7, 0xc7).nopw(); +} + +void ampex210_state::vram_map(address_map &map) +{ + map(0x0000, 0x1fff).ram(); // MB8464A-10L (second half unused?) } @@ -60,21 +71,25 @@ INPUT_PORTS_END void ampex210_state::ampex210p(machine_config &config) { - Z80(config, m_maincpu, 4'000'000); + Z80(config, m_maincpu, 3.6864_MHz_XTAL); // Z80ACPU; clock uncertain m_maincpu->set_addrmap(AS_PROGRAM, &ex210_state::mem_map); m_maincpu->set_addrmap(AS_IO, &ex210_state::io_map); - mos6551_device &acia(MOS6551(config, "acia", 1'843'200)); + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // UM6116-2 + + mos6551_device &acia(MOS6551(config, "acia", 3.6864_MHz_XTAL / 2)); // AMI S6551AP acia.irq_handler().set_inputline("maincpu", INPUT_LINE_IRQ0); - scn2672_device &pvtc(SCN2672(config, "pvtc", 2'178'000)); + scn2672_device &pvtc(SCN2672(config, "pvtc", 19.602_MHz_XTAL / 9)); // MC2672B4P pvtc.intr_callback().set_inputline("maincpu", INPUT_LINE_NMI); - pvtc.set_character_width(10); + pvtc.set_character_width(9); pvtc.set_display_callback(FUNC(ampex210_state::draw_character)); + pvtc.set_addrmap(0, &ex210_state::vram_map); pvtc.set_screen("screen"); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(21'780'000, 1000, 0, 800, 363, 0, 300); // clock guessed + screen.set_raw(19.602_MHz_XTAL, 900, 0, 720, 363, 0, 300); + //screen.set_raw(32.147_MHz_XTAL, 1476, 0, 1188, 363, 0, 300); screen.set_screen_update("pvtc", FUNC(scn2672_device::screen_update)); } diff --git a/src/mame/drivers/amust.cpp b/src/mame/drivers/amust.cpp index 7f9f315c240..8a810dce397 100644 --- a/src/mame/drivers/amust.cpp +++ b/src/mame/drivers/amust.cpp @@ -193,10 +193,8 @@ void amust_state::io_map(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); - map(0x00, 0x00).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x01, 0x01).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x02, 0x02).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x03, 0x03).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x00, 0x01).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x02, 0x03).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x04, 0x07).rw("ppi1", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x08, 0x0b).rw("ppi2", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x0d, 0x0d).nopr().w(FUNC(amust_state::port0d_w)); diff --git a/src/mame/drivers/att4425.cpp b/src/mame/drivers/att4425.cpp index 11cdf80bf5d..a6ce9fa3314 100644 --- a/src/mame/drivers/att4425.cpp +++ b/src/mame/drivers/att4425.cpp @@ -110,8 +110,7 @@ void att4425_state::att4425_mem(address_map &map) void att4425_state::att4425_io(address_map &map) { map.global_mask(0xff); - map(0x00, 0x00).rw(m_i8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x01, 0x01).rw(m_i8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x00, 0x01).rw(m_i8251, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x10, 0x10).w(FUNC(att4425_state::port10_w)); map(0x14, 0x14).rw(FUNC(att4425_state::port14_r), FUNC(att4425_state::port14_w)); map(0x15, 0x15).r(FUNC(att4425_state::port15_r)); diff --git a/src/mame/drivers/b2m.cpp b/src/mame/drivers/b2m.cpp index e3584d0b747..f3c7b2ab6a6 100644 --- a/src/mame/drivers/b2m.cpp +++ b/src/mame/drivers/b2m.cpp @@ -42,8 +42,7 @@ void b2m_state::b2m_io(address_map &map) map(0x0c, 0x0c).rw(FUNC(b2m_state::b2m_localmachine_r), FUNC(b2m_state::b2m_localmachine_w)); map(0x10, 0x13).rw(FUNC(b2m_state::b2m_palette_r), FUNC(b2m_state::b2m_palette_w)); map(0x14, 0x15).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); - map(0x18, 0x18).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x19, 0x19).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x18, 0x19).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x1c, 0x1f).rw(m_fdc, FUNC(fd1793_device::read), FUNC(fd1793_device::write)); } @@ -56,8 +55,7 @@ void b2m_state::b2m_rom_io(address_map &map) map(0x0c, 0x0c).rw(FUNC(b2m_state::b2m_localmachine_r), FUNC(b2m_state::b2m_localmachine_w)); map(0x10, 0x13).rw(FUNC(b2m_state::b2m_palette_r), FUNC(b2m_state::b2m_palette_w)); map(0x14, 0x15).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); - map(0x18, 0x18).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x19, 0x19).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x18, 0x19).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); } diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index af78c26ebe6..f9647cb0c2a 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -150,14 +150,14 @@ void bbc_state::bbca_mem(address_map &map) map(0x8000, 0xbfff).bankr("bank4").w(FUNC(bbc_state::bbc_memoryb4_w)); // 8000-bfff Paged ROM map(0xc000, 0xfbff).bankr("bank7"); // c000-fbff OS ROM map(0xfc00, 0xfdff).noprw(); // fc00-fdff FRED & JIM Pages - // fe00-feff SHEILA Address Page + map(0xfe00, 0xfeff).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); // fe00-fe07 6845 CRTC Video controller map(0xfe01, 0xfe01).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::register_r), FUNC(hd6845_device::register_w)); map(0xfe08, 0xfe09).mirror(0x06).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller map(0xfe10, 0xfe17).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_SerialULA_w)); // fe10-fe17 Serial ULA Serial system chip map(0xfe18, 0xfe1f).noprw(); // fe18-fe1f INTOFF/STATID # ECONET Interrupt Off / ID No. map(0xfe20, 0xfe2f).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_videoULA_w)); // R: fe20-fe2f INTON # ECONET Interrupt On - // W: fe20-fe2f Video ULA Video system chip + // W: fe20-fe2f Video ULA Video system chip map(0xfe30, 0xfe3f).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::page_selecta_w)); // W: fe30-fe3f 74LS161 Paged ROM selector map(0xfe40, 0xfe5f).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe40-fe5f 6522 VIA SYSTEM VIA map(0xfe60, 0xfe7f).noprw(); // fe60-fe7f 6522 VIA # USER VIA @@ -173,7 +173,8 @@ void bbc_state::bbc_base(address_map &map) { map.unmap_value_high(); map(0xc000, 0xfbff).bankr("bank7"); // c000-fbff OS ROM - map(0xfc00, 0xfdff).noprw(); // fc00-fdff FRED & JIM Pages + map(0xfc00, 0xfcff).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::fred_r), FUNC(bbc_1mhzbus_slot_device::fred_w)); // fc00-fcff FRED Address Page + map(0xfd00, 0xfdff).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::jim_r), FUNC(bbc_1mhzbus_slot_device::jim_w)); // fd00-fdff JIM Address Page map(0xfe00, 0xfeff).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); // fe00-fe07 6845 CRTC Video controller map(0xfe01, 0xfe01).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::register_r), FUNC(hd6845_device::register_w)); @@ -181,10 +182,10 @@ void bbc_state::bbc_base(address_map &map) map(0xfe10, 0xfe17).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_SerialULA_w)); // fe10-fe17 Serial ULA Serial system chip map(0xfe18, 0xfe1f).portr("STATID"); // fe18-fe1f INTOFF/STATID ECONET Interrupt Off / ID No. map(0xfe20, 0xfe2f).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_videoULA_w)); // R: fe20-fe2f INTON ECONET Interrupt On - // W: fe20-fe2f Video ULA Video system chip + // W: fe20-fe2f Video ULA Video system chip map(0xfe40, 0xfe5f).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe40-fe5f 6522 VIA SYSTEM VIA map(0xfe60, 0xfe7f).rw(m_via6522_1, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe60-fe7f 6522 VIA USER VIA - // fe80-fe9f FDC Floppy disc controller + // fe80-fe9f FDC Floppy disc controller map(0xfea0, 0xfebf).r(FUNC(bbc_state::bbc_fe_r)); // fea0-febf 68B54 ADLC ECONET controller map(0xfec0, 0xfedf).rw(m_upd7002, FUNC(upd7002_device::read), FUNC(upd7002_device::write)); // fec0-fedf uPD7002 Analogue to digital converter map(0xfee0, 0xfeff).rw(m_tube, FUNC(bbc_tube_slot_device::host_r), FUNC(bbc_tube_slot_device::host_w)); // fee0-feff Tube ULA Tube system interface @@ -211,6 +212,7 @@ void bbc_state::bbcb_nofdc_mem(address_map &map) map(0x4000, 0x7fff).bankrw("bank3"); // 4000-7fff Regular RAM map(0x8000, 0xbfff).bankr("bank4").w(FUNC(bbc_state::bbc_memoryb4_w)); // 8000-bfff Paged ROM/RAM map(0xfe30, 0xfe3f).w(FUNC(bbc_state::page_selectb_w)); // W: fe30-fe3f 84LS161 Paged ROM selector + map(0xfe80, 0xfe9f).rw(m_fdc, FUNC(bbc_fdc_slot_device::read), FUNC(bbc_fdc_slot_device::write)); // fe84-fe9f 8271 FDC Floppy disc controller } @@ -796,30 +798,21 @@ WRITE_LINE_MEMBER(bbc_state::adlc_irq_w) } -WRITE_LINE_MEMBER(bbc_state::econet_clk_w) +// 4 x EPROM sockets (16K) in BBC-A, these should grow to 16 for BBC-B and later... +void bbc_state::bbc_eprom_sockets(machine_config &config) { - m_adlc->rxc_w(state); - m_adlc->txc_w(state); -} + GENERIC_SOCKET(config, m_exp1, generic_linear_slot, "bbc_rom", "bin,rom"); + m_exp1->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp1_load, this)); -// 4 x EPROM sockets (16K) in BBC-A, these should grow to 16 for BBC-B and later... -MACHINE_CONFIG_START(bbc_state::bbc_eprom_sockets) - MCFG_GENERIC_SOCKET_ADD("exp_rom1", generic_linear_slot, "bbc_cart") - MCFG_GENERIC_EXTENSIONS("bin,rom") - MCFG_GENERIC_LOAD(bbc_state, exp1_load) - - MCFG_GENERIC_SOCKET_ADD("exp_rom2", generic_linear_slot, "bbc_cart") - MCFG_GENERIC_EXTENSIONS("bin,rom") - MCFG_GENERIC_LOAD(bbc_state, exp2_load) - - MCFG_GENERIC_SOCKET_ADD("exp_rom3", generic_linear_slot, "bbc_cart") - MCFG_GENERIC_EXTENSIONS("bin,rom") - MCFG_GENERIC_LOAD(bbc_state, exp3_load) - - MCFG_GENERIC_SOCKET_ADD("exp_rom4", generic_linear_slot, "bbc_cart") - MCFG_GENERIC_EXTENSIONS("bin,rom") - MCFG_GENERIC_LOAD(bbc_state, exp4_load) -MACHINE_CONFIG_END + GENERIC_SOCKET(config, m_exp2, generic_linear_slot, "bbc_rom", "bin,rom"); + m_exp2->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp2_load, this)); + + GENERIC_SOCKET(config, m_exp3, generic_linear_slot, "bbc_rom", "bin,rom"); + m_exp3->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp3_load, this)); + + GENERIC_SOCKET(config, m_exp4, generic_linear_slot, "bbc_rom", "bin,rom"); + m_exp4->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp4_load, this)); +} /*************************************************************************** @@ -831,13 +824,12 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(bbc_state::bbca) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M6502, 16_MHz_XTAL/8) /* 2.00 MHz */ - MCFG_DEVICE_PROGRAM_MAP(bbca_mem) - MCFG_DEVICE_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */ - MCFG_QUANTUM_TIME(attotime::from_hz(60)) + M6502(config, m_maincpu, 16_MHz_XTAL / 8); + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbca_mem); + m_maincpu->set_periodic_int(FUNC(bbc_state::bbcb_keyscan), attotime::from_hz(1000)); /* scan keyboard */ + config.m_minimum_quantum = attotime::from_hz(60); - MCFG_INPUT_MERGER_ANY_HIGH("irqs") - MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE)) + INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); /* internal ram */ RAM(config, m_ram).set_default_size("16K").set_extra_options("32K").set_default_value(0x00); @@ -846,24 +838,25 @@ MACHINE_CONFIG_START(bbc_state::bbca) MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbca) /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256) - MCFG_SCREEN_UPDATE_DEVICE("hd6845", hd6845_device, screen_update) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256); + m_screen->set_screen_update("hd6845", FUNC(hd6845_device::screen_update)); - MCFG_PALETTE_ADD("palette", 16) - MCFG_PALETTE_INIT_OWNER(bbc_state,bbc) + palette_device &palette(PALETTE(config, "palette", 16)); + palette.set_init(palette_init_delegate(FUNC(bbc_state::palette_init_bbc), this)); - MCFG_DEVICE_ADD("saa5050", SAA5050, 12_MHz_XTAL/2) - MCFG_SAA5050_SCREEN_SIZE(40, 25, 40) + SAA5050(config, m_trom, 12_MHz_XTAL / 2); + m_trom->set_screen_size(40, 25, 40); /* crtc */ - MCFG_MC6845_ADD("hd6845", HD6845, "screen", 16_MHz_XTAL / 8) - MCFG_MC6845_SHOW_BORDER_AREA(false) - MCFG_MC6845_CHAR_WIDTH(12) - MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row) - MCFG_MC6845_OUT_DE_CB(WRITELINE(*this, bbc_state, bbc_de_changed)) - MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(*this, bbc_state, bbc_hsync_changed)) - MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(*this, bbc_state, bbc_vsync_changed)) + HD6845(config, m_hd6845, 16_MHz_XTAL / 8); + m_hd6845->set_screen("screen"); + m_hd6845->set_show_border_area(false); + m_hd6845->set_char_width(12); + m_hd6845->set_update_row_callback(FUNC(bbc_state::crtc_update_row), this); + m_hd6845->out_de_callback().set(FUNC(bbc_state::bbc_de_changed)); + m_hd6845->out_hsync_callback().set(FUNC(bbc_state::bbc_hsync_changed)); + m_hd6845->out_vsync_callback().set(FUNC(bbc_state::bbc_vsync_changed)); MCFG_VIDEO_START_OVERRIDE(bbc_state, bbc) @@ -871,23 +864,23 @@ MACHINE_CONFIG_START(bbc_state::bbca) /* sound hardware */ SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("sn76489", SN76489, 16_MHz_XTAL/4) /* 4 MHz */ - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + SN76489(config, m_sn, 16_MHz_XTAL / 4); + m_sn->add_route(ALL_OUTPUTS, "mono", 1.0); /* cassette relay */ - MCFG_DEVICE_ADD("samples", SAMPLES) - MCFG_SAMPLES_CHANNELS(1) - MCFG_SAMPLES_NAMES(bbc_sample_names) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + SAMPLES(config, m_samples); + m_samples->set_channels(1); + m_samples->set_samples_names(bbc_sample_names); + m_samples->add_route(ALL_OUTPUTS, "mono", 1.0); /* cassette */ - MCFG_CASSETTE_ADD( "cassette" ) - MCFG_CASSETTE_FORMATS(bbc_cassette_formats) - MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED) - MCFG_CASSETTE_INTERFACE("bbc_cass") + CASSETTE(config, m_cassette); + m_cassette->set_formats(bbc_cassette_formats); + m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED); + m_cassette->set_interface("bbc_cass"); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("cass_ls_a", "bbca_cass") + SOFTWARE_LIST(config, "cass_ls_a").set_original("bbca_cass"); /* acia */ ACIA6850(config, m_acia, 0); @@ -895,13 +888,13 @@ MACHINE_CONFIG_START(bbc_state::bbca) m_acia->rts_handler().set(FUNC(bbc_state::bbc_rts_w)); m_acia->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>)); - MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE(*this, bbc_state, write_rxd_serial)) - MCFG_RS232_DCD_HANDLER(WRITELINE(*this, bbc_state, write_dcd_serial)) - MCFG_RS232_CTS_HANDLER(WRITELINE(*this, bbc_state, write_cts_serial)) + RS232_PORT(config, m_rs232, default_rs232_devices, nullptr); + m_rs232->rxd_handler().set(FUNC(bbc_state::write_rxd_serial)); + m_rs232->dcd_handler().set(FUNC(bbc_state::write_dcd_serial)); + m_rs232->cts_handler().set(FUNC(bbc_state::write_cts_serial)); - MCFG_DEVICE_ADD("acia_clock", CLOCK, 16_MHz_XTAL / 13) - MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, bbc_state, write_acia_clock)) + CLOCK(config, m_acia_clock, 16_MHz_XTAL / 13); + m_acia_clock->signal_handler().set(FUNC(bbc_state::write_acia_clock)); /* system via */ VIA6522(config, m_via6522_0, 16_MHz_XTAL / 16); @@ -919,8 +912,7 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(bbc_state::bbcb) bbca(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(bbcb_nofdc_mem) + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcb_nofdc_mem); MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcb) MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcb) @@ -929,10 +921,10 @@ MACHINE_CONFIG_START(bbc_state::bbcb) m_ram->set_default_size("32K").set_default_value(0x00); /* speech hardware */ - MCFG_DEVICE_ADD("vsm", SPEECHROM, 0) - MCFG_DEVICE_ADD("tms5220", TMS5220, 640000) - MCFG_TMS52XX_SPEECHROM("vsm") - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + SPEECHROM(config, "vsm", 0).set_reverse_bit_order(true); + TMS5220(config, m_tms, 640000); + m_tms->set_speechrom_tag("vsm"); + m_tms->add_route(ALL_OUTPUTS, "mono", 1.0); /* user via */ VIA6522(config, m_via6522_1, 16_MHz_XTAL / 16); @@ -950,126 +942,123 @@ MACHINE_CONFIG_START(bbc_state::bbcb) /* printer */ centronics_device ¢ronics(CENTRONICS(config, "centronics", centronics_devices, "printer")); centronics.ack_handler().set("via6522_1", FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted? - MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") + output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out")); + centronics.set_output_latch(latch); /* fdc */ - MCFG_BBC_FDC_SLOT_ADD("fdc", bbc_fdc_devices, "acorn8271", false) - MCFG_BBC_FDC_SLOT_INTRQ_HANDLER(WRITELINE(*this, bbc_state, fdc_intrq_w)) - MCFG_BBC_FDC_SLOT_DRQ_HANDLER(WRITELINE(*this, bbc_state, fdc_drq_w)) + BBC_FDC_SLOT(config, m_fdc, bbc_fdc_devices, "acorn8271"); + m_fdc->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w)); + m_fdc->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w)); /* econet */ MC6854(config, m_adlc); m_adlc->out_txd_cb().set(ECONET_TAG, FUNC(econet_device::host_data_w)); m_adlc->out_irq_cb().set(FUNC(bbc_state::adlc_irq_w)); - MCFG_ECONET_ADD() - MCFG_ECONET_CLK_CALLBACK(WRITELINE(*this, bbc_state, econet_clk_w)) - MCFG_ECONET_DATA_CALLBACK(WRITELINE("mc6854", mc6854_device, set_rx)) - MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr) + + econet_device &econet(ECONET(config, "econet", 0)); + econet.clk_wr_callback().set(m_adlc, FUNC(mc6854_device::txc_w)); + econet.clk_wr_callback().append(m_adlc, FUNC(mc6854_device::rxc_w)); + econet.data_wr_callback().set(m_adlc, FUNC(mc6854_device::set_rx)); + + econet_slot_device &econet_slot(ECONET_SLOT(config, "econet254", 0)); + econet_devices(econet_slot); + econet_slot.set_slot(254); /* analogue port */ - MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, nullptr) + BBC_ANALOGUE_SLOT(config, m_analog, bbc_analogue_devices, nullptr); + m_analog->lpstb_handler().set(FUNC(bbc_state::lpstb_w)); /* 1mhz bus port */ - MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbc_1mhzbus_devices, nullptr) - MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<3>)) - MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(*this, bbc_state, bus_nmi_w)) + BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbc_1mhzbus_devices, nullptr); + m_1mhzbus->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<3>)); + m_1mhzbus->nmi_handler().set(FUNC(bbc_state::bus_nmi_w)); /* tube port */ - MCFG_BBC_TUBE_SLOT_ADD("tube", bbc_extube_devices, nullptr) - MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<4>)) + BBC_TUBE_SLOT(config, m_tube, bbc_extube_devices, nullptr); + m_tube->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<4>)); /* user port */ - MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr) - MCFG_BBC_USERPORT_CB1_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb1)) - MCFG_BBC_USERPORT_CB2_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb2)) + BBC_USERPORT_SLOT(config, m_userport, bbc_userport_devices, nullptr); + m_userport->cb1_handler().set(m_via6522_1, FUNC(via6522_device::write_cb1)); + m_userport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2)); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass") - MCFG_SOFTWARE_LIST_ADD("flop_ls_b", "bbcb_flop") - MCFG_SOFTWARE_LIST_ADD("flop_ls_b_orig", "bbcb_flop_orig") + SOFTWARE_LIST(config, "cass_ls_b").set_original("bbcb_cass"); + SOFTWARE_LIST(config, "flop_ls_b").set_original("bbcb_flop"); + SOFTWARE_LIST(config, "flop_ls_b_orig").set_original("bbcb_flop_orig"); MACHINE_CONFIG_END -MACHINE_CONFIG_START(bbc_state::bbcb_de) +void bbc_state::bbcb_de(machine_config &config) +{ bbcb(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(bbcb_mem) + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcb_mem); /* fdc */ - MCFG_DEVICE_REMOVE("fdc") - I8271(config, m_i8271, 0); + config.device_remove("fdc"); + I8271(config, m_i8271, 16_MHz_XTAL / 8); m_i8271->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w)); m_i8271->hdl_wr_callback().set(FUNC(bbc_state::motor_w)); m_i8271->opt_wr_callback().set(FUNC(bbc_state::side_w)); - MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) + + FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true); + FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_ls_b_de", "bbcb_cass_de") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop_ls_b_de").set_original("bbcb_cass_de"); +} -MACHINE_CONFIG_START(bbc_state::bbcb_us) +void bbc_state::bbcb_us(machine_config &config) +{ bbcb(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(bbcb_mem) + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcb_mem); /* video hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_SIZE(640, 200) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1) - MCFG_SCREEN_REFRESH_RATE(60) + m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 262, 0, 200); /* fdc */ - MCFG_DEVICE_REMOVE("fdc") - I8271(config, m_i8271, 0); + config.device_remove("fdc"); + I8271(config, m_i8271, 16_MHz_XTAL / 8); m_i8271->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w)); m_i8271->hdl_wr_callback().set(FUNC(bbc_state::motor_w)); m_i8271->opt_wr_callback().set(FUNC(bbc_state::side_w)); - MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) + FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true); + FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_ls_b_us", "bbcb_flop_us") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop_ls_b_us").set_original("bbcb_cass_us"); +} MACHINE_CONFIG_START(bbc_state::bbcbp) bbcb(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") /* M6512 */ - MCFG_DEVICE_PROGRAM_MAP(bbcbp_mem) - MCFG_DEVICE_OPCODES_MAP(bbcbp_fetch) + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcbp_mem); + m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcbp_fetch); MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp) MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp) /* fdc */ - MCFG_DEVICE_REMOVE("fdc") + config.device_remove("fdc"); WD1770(config, m_wd1770, 16_MHz_XTAL / 2); m_wd1770->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w)); m_wd1770->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w)); - MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) + FLOPPY_CONNECTOR(config, "wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true); + FLOPPY_CONNECTOR(config, "wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true); MACHINE_CONFIG_END MACHINE_CONFIG_START(bbc_state::bbcbp128) bbcbp(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") /* M6512 */ - MCFG_DEVICE_PROGRAM_MAP(bbcbp128_mem) - MCFG_DEVICE_OPCODES_MAP(bbcbp_fetch) + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcbp128_mem); + m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcbp_fetch); MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp) MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp) @@ -1092,42 +1081,41 @@ MACHINE_CONFIG_START(torch_state::torchf) MCFG_MACHINE_RESET_OVERRIDE(bbc_state, torch) /* fdc */ - MCFG_DEVICE_REMOVE("fdc") - I8271(config, m_i8271, 0); + config.device_remove("fdc"); + I8271(config, m_i8271, 16_MHz_XTAL / 8); m_i8271->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w)); m_i8271->hdl_wr_callback().set(FUNC(bbc_state::motor_w)); m_i8271->opt_wr_callback().set(FUNC(bbc_state::side_w)); - MCFG_FLOPPY_DRIVE_ADD_FIXED("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD_FIXED("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) + FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc, true).enable_sound(true); + FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true); /* Add Torch Z80 Communicator co-processor */ - MCFG_DEVICE_MODIFY("tube") - MCFG_SLOT_DEFAULT_OPTION("zep100") - MCFG_SLOT_FIXED(true) + m_tube->set_default_option("zep100"); + m_tube->set_fixed(true); MACHINE_CONFIG_END -MACHINE_CONFIG_START(torch_state::torchh10) +void torch_state::torchh10(machine_config &config) +{ torchf(config); /* fdc */ - MCFG_DEVICE_REMOVE("i8271:1") + config.device_remove("i8271:1"); /* Add 10MB HDD */ -MACHINE_CONFIG_END +} -MACHINE_CONFIG_START(torch_state::torchh21) +void torch_state::torchh21(machine_config &config) +{ torchf(config); /* fdc */ - MCFG_DEVICE_REMOVE("i8271:1") + config.device_remove("i8271:1"); /* Add 21MB HDD */ -MACHINE_CONFIG_END +} /*************************************************************************** @@ -1137,94 +1125,74 @@ MACHINE_CONFIG_END ****************************************************************************/ -MACHINE_CONFIG_START(bbc_state::abc110) +void bbc_state::abc110(machine_config &config) +{ bbcbp(config); /* fdc */ - MCFG_DEVICE_REMOVE("wd1770:1") + config.device_remove("wd1770:1"); /* Acorn Z80 co-processor */ - MCFG_DEVICE_MODIFY("tube") - MCFG_SLOT_DEFAULT_OPTION("z80") - MCFG_SLOT_FIXED(true) + m_tube->set_default_option("z80"); + m_tube->set_fixed(true); /* Add ADAPTEC ACB-4000 Winchester Disc Controller */ - //scsi_port_device &scsibus(SCSI_PORT(config, SCSIBUS_TAG)); - //scsibus.set_data_input_buffer("scsi_data_in"); - //scsibus.msg_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit0)); - //scsibus.bsy_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::scsi_bsy_w)) - //scsibus.req_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::scsi_req_w)) - //scsibus.io_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit6)); - //scsibus.cd_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit7)); - //scsibus.set_slot_device(1, "harddisk", ACB4070, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0)); - - //output_latch_device &scsiout(OUTPUT_LATCH(config, "scsi_data_out")); - //scsibus.set_output_latch(scsiout); - //scsiout.bit_handler<0>().set("scsi", FUNC(scsi_port_device::write_data0)); - //scsiout.bit_handler<1>().set("scsi", FUNC(scsi_port_device::write_data1)); - //scsiout.bit_handler<2>().set("scsi", FUNC(scsi_port_device::write_data2)); - //scsiout.bit_handler<3>().set("scsi", FUNC(scsi_port_device::write_data3)); - //scsiout.bit_handler<4>().set("scsi", FUNC(scsi_port_device::write_data4)); - //scsiout.bit_handler<5>().set("scsi", FUNC(scsi_port_device::write_data5)); - //scsiout.bit_handler<6>().set("scsi", FUNC(scsi_port_device::write_data6)); - //scsiout.bit_handler<7>().set("scsi", FUNC(scsi_port_device::write_data7)); - - //INPUT_BUFFER(config, "scsi_ctrl_in"); - //INPUT_BUFFER(config, "scsi_data_in"); /* Add 10MB ST-412 Winchester */ /* software lists */ - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig") -MACHINE_CONFIG_END + config.device_remove("cass_ls_a"); + config.device_remove("cass_ls_b"); + config.device_remove("flop_ls_b"); + config.device_remove("flop_ls_b_orig"); +} -MACHINE_CONFIG_START(bbc_state::acw443) +void bbc_state::acw443(machine_config &config) +{ bbcbp(config); /* fdc */ - MCFG_DEVICE_REMOVE("wd1770:1") + config.device_remove("wd1770:1"); /* Add 32016 co-processor */ - //MCFG_DEVICE_MODIFY("tube") - //MCFG_SLOT_DEFAULT_OPTION("32016") - //MCFG_SLOT_FIXED(true) + //m_tube->set_default_option("32016"); + //m_tube->set_fixed(true); /* Add ADAPTEC ACB-4000 Winchester Disc Controller */ + //m_1mhzbus->set_default_option("awdd"); + //m_1mhzbus->set_fixed(true); /* Add 10MB ST-412 Winchester ABC210 */ /* Add 20MB ST-412 Winchester Cambridge */ /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_flop_32016") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig") -MACHINE_CONFIG_END + SOFTWARE_LIST(config, "flop_ls_32016").set_original("bbc_flop_32016"); + config.device_remove("cass_ls_a"); + config.device_remove("cass_ls_b"); + config.device_remove("flop_ls_b"); + config.device_remove("flop_ls_b_orig"); +} -MACHINE_CONFIG_START(bbc_state::abc310) +void bbc_state::abc310(machine_config &config) +{ bbcbp(config); /* fdc */ - MCFG_DEVICE_REMOVE("wd1770:1") + config.device_remove("wd1770:1"); /* Acorn 80286 co-processor */ - MCFG_DEVICE_MODIFY("tube") - MCFG_SLOT_DEFAULT_OPTION("80286") - MCFG_SLOT_FIXED(true) + m_tube->set_default_option("80286"); + m_tube->set_fixed(true); /* Add ADAPTEC ACB-4000 Winchester Disc Controller */ /* Add 10MB ST-412 Winchester */ /* software lists */ - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b") -MACHINE_CONFIG_END + config.device_remove("cass_ls_a"); + config.device_remove("cass_ls_b"); + config.device_remove("flop_ls_b"); +} /*************************************************************************** @@ -1234,35 +1202,35 @@ MACHINE_CONFIG_END ****************************************************************************/ -MACHINE_CONFIG_START(bbc_state::reutapm) +void bbc_state::reutapm(machine_config &config) +{ bbcbp(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") /* M6512 */ - MCFG_DEVICE_PROGRAM_MAP(reutapm_mem) - MCFG_DEVICE_OPCODES_MAP(bbcbp_fetch) + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::reutapm_mem); + m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcbp_fetch); /* sound hardware */ - MCFG_DEVICE_REMOVE("mono") - MCFG_DEVICE_REMOVE("sn76489") - MCFG_DEVICE_REMOVE("samples") - MCFG_DEVICE_REMOVE("vsm") - MCFG_DEVICE_REMOVE("tms5220") + config.device_remove("mono"); + config.device_remove("sn76489"); + config.device_remove("samples"); + config.device_remove("vsm"); + config.device_remove("tms5220"); /* cassette */ - MCFG_DEVICE_REMOVE( "cassette" ) + config.device_remove("cassette"); /* fdc */ config.device_remove("wd1770"); /* software lists */ - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig") + config.device_remove("cass_ls_a"); + config.device_remove("cass_ls_b"); + config.device_remove("flop_ls_b"); + config.device_remove("flop_ls_b_orig"); /* expansion ports */ - MCFG_DEVICE_REMOVE("analogue") -MACHINE_CONFIG_END + config.device_remove("analogue"); +} /*************************************************************************** @@ -1280,11 +1248,12 @@ void bbc_state::econx25(machine_config &config) config.device_remove("tms5220"); /* fdc */ - //config.device_remove("wd1770"); + //config.device_remove("wd1770") /* Add Econet X25 Gateway co-processor */ - //MCFG_DEVICE_MODIFY("tube") - //MCFG_DEVICE_SLOT_INTERFACE(bbc_x25tube_devices, "x25", true) + //m_tube->option_list(bbc_x25tube_devices); + //m_tube->set_default_option("x25"); + //m_tube->set_fixed(true); /* software lists */ config.device_remove("cass_ls_a"); @@ -1303,14 +1272,13 @@ void bbc_state::econx25(machine_config &config) MACHINE_CONFIG_START(bbc_state::bbcm) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", M65SC02, 16_MHz_XTAL/8) /* 2.00 MHz */ - MCFG_DEVICE_PROGRAM_MAP(bbcm_mem) - MCFG_DEVICE_OPCODES_MAP(bbcm_fetch) - MCFG_DEVICE_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */ - MCFG_QUANTUM_TIME(attotime::from_hz(60)) + M65SC02(config, m_maincpu, 16_MHz_XTAL / 8); + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcm_mem); + m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcm_fetch); + m_maincpu->set_periodic_int(FUNC(bbc_state::bbcb_keyscan), attotime::from_hz(1000)); /* scan keyboard */ + config.m_minimum_quantum = attotime::from_hz(60); - MCFG_INPUT_MERGER_ANY_HIGH("irqs") - MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE)) + INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); /* internal ram */ RAM(config, RAM_TAG).set_default_size("32K").set_default_value(0x00); @@ -1321,67 +1289,69 @@ MACHINE_CONFIG_START(bbc_state::bbcm) config.set_default_layout(layout_bbcm); /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256) - MCFG_SCREEN_UPDATE_DEVICE("hd6845", hd6845_device, screen_update) + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256); + m_screen->set_screen_update("hd6845", FUNC(hd6845_device::screen_update)); - MCFG_PALETTE_ADD("palette", 16) - MCFG_PALETTE_INIT_OWNER(bbc_state, bbc) + palette_device &palette(PALETTE(config, "palette", 16)); + palette.set_init(palette_init_delegate(FUNC(bbc_state::palette_init_bbc), this)); - MCFG_DEVICE_ADD("saa5050", SAA5050, 12_MHz_XTAL / 2) - MCFG_SAA5050_SCREEN_SIZE(40, 25, 40) + SAA5050(config, m_trom, 12_MHz_XTAL / 2); + m_trom->set_screen_size(40, 25, 40); /* crtc */ - MCFG_MC6845_ADD("hd6845", HD6845, "screen", 16_MHz_XTAL / 8) - MCFG_MC6845_SHOW_BORDER_AREA(false) - MCFG_MC6845_CHAR_WIDTH(12) - MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row) - MCFG_MC6845_OUT_DE_CB(WRITELINE(*this, bbc_state, bbc_de_changed)) - MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(*this, bbc_state, bbc_hsync_changed)) - MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(*this, bbc_state, bbc_vsync_changed)) + HD6845(config, m_hd6845, 16_MHz_XTAL / 8); + m_hd6845->set_screen("screen"); + m_hd6845->set_show_border_area(false); + m_hd6845->set_char_width(12); + m_hd6845->set_update_row_callback(FUNC(bbc_state::crtc_update_row), this); + m_hd6845->out_de_callback().set(FUNC(bbc_state::bbc_de_changed)); + m_hd6845->out_hsync_callback().set(FUNC(bbc_state::bbc_hsync_changed)); + m_hd6845->out_vsync_callback().set(FUNC(bbc_state::bbc_vsync_changed)); MCFG_VIDEO_START_OVERRIDE(bbc_state, bbc) /* sound hardware */ SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("sn76489", SN76489, 16_MHz_XTAL/4) /* 4 MHz */ - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + SN76489(config, m_sn, 16_MHz_XTAL / 4); + m_sn->add_route(ALL_OUTPUTS, "mono", 1.0); /* cassette relay */ - MCFG_DEVICE_ADD("samples", SAMPLES) - MCFG_SAMPLES_CHANNELS(1) - MCFG_SAMPLES_NAMES(bbc_sample_names) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + SAMPLES(config, m_samples); + m_samples->set_channels(1); + m_samples->set_samples_names(bbc_sample_names); + m_samples->add_route(ALL_OUTPUTS, "mono", 1.0); /* rtc and cmos */ - MCFG_DEVICE_ADD("rtc", MC146818, 32.768_kHz_XTAL) + MC146818(config, m_rtc, 32.768_kHz_XTAL); /* printer */ centronics_device ¢ronics(CENTRONICS(config, "centronics", centronics_devices, "printer")); centronics.ack_handler().set("via6522_1", FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted? - MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") + output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out")); + centronics.set_output_latch(latch); /* cassette */ - MCFG_CASSETTE_ADD( "cassette" ) - MCFG_CASSETTE_FORMATS(bbc_cassette_formats) - MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED) - MCFG_CASSETTE_INTERFACE("bbc_cass") + CASSETTE(config, m_cassette); + m_cassette->set_formats(bbc_cassette_formats); + m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED); + m_cassette->set_interface("bbc_cass"); // 2 x cartridge sockets in BBC-Master - MCFG_GENERIC_CARTSLOT_ADD("exp_rom1", generic_plain_slot, "bbcm_cart") - MCFG_GENERIC_LOAD(bbc_state, bbcm_exp1_load) + GENERIC_CARTSLOT(config, m_exp1, generic_linear_slot, "bbcm_cart", "bin,rom"); + m_exp1->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_bbcm_cart1_load, this)); - MCFG_GENERIC_CARTSLOT_ADD("exp_rom2", generic_plain_slot, "bbcm_cart") - MCFG_GENERIC_LOAD(bbc_state, bbcm_exp2_load) + GENERIC_CARTSLOT(config, m_exp2, generic_linear_slot, "bbcm_cart", "bin,rom"); + m_exp2->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_bbcm_cart2_load, this)); /* software lists */ - MCFG_SOFTWARE_LIST_ADD("cass_ls_m", "bbcm_cass") - MCFG_SOFTWARE_LIST_ADD("flop_ls_m", "bbcm_flop") - MCFG_SOFTWARE_LIST_ADD("cart_ls_m", "bbcm_cart") - MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass") - MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b", "bbcb_cass") - MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b", "bbcb_flop") - MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b_orig", "bbcb_flop_orig") + SOFTWARE_LIST(config, "cass_ls_m").set_original("bbcm_cass"); + SOFTWARE_LIST(config, "flop_ls_m").set_original("bbcm_flop"); + SOFTWARE_LIST(config, "cart_ls_m").set_original("bbcm_cart"); + SOFTWARE_LIST(config, "cass_ls_a").set_compatible("bbca_cass"); + SOFTWARE_LIST(config, "cass_ls_b").set_compatible("bbcb_cass"); + SOFTWARE_LIST(config, "flop_ls_b").set_compatible("bbcb_flop"); + SOFTWARE_LIST(config, "flop_ls_b_orig").set_compatible("bbcb_flop_orig"); /* acia */ ACIA6850(config, m_acia, 0); @@ -1389,13 +1359,13 @@ MACHINE_CONFIG_START(bbc_state::bbcm) m_acia->rts_handler().set(FUNC(bbc_state::bbc_rts_w)); m_acia->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>)); - MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(WRITELINE(*this, bbc_state, write_rxd_serial)) - MCFG_RS232_DCD_HANDLER(WRITELINE(*this, bbc_state, write_dcd_serial)) - MCFG_RS232_CTS_HANDLER(WRITELINE(*this, bbc_state, write_cts_serial)) + RS232_PORT(config, m_rs232, default_rs232_devices, nullptr); + m_rs232->rxd_handler().set(FUNC(bbc_state::write_rxd_serial)); + m_rs232->dcd_handler().set(FUNC(bbc_state::write_dcd_serial)); + m_rs232->cts_handler().set(FUNC(bbc_state::write_cts_serial)); - MCFG_DEVICE_ADD("acia_clock", CLOCK, 16_MHz_XTAL / 13) - MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, bbc_state, write_acia_clock)) + CLOCK(config, m_acia_clock, 16_MHz_XTAL / 13); + m_acia_clock->signal_handler().set(FUNC(bbc_state::write_acia_clock)); /* adc */ MCFG_DEVICE_ADD("upd7002", UPD7002, 0) @@ -1423,152 +1393,156 @@ MACHINE_CONFIG_START(bbc_state::bbcm) m_wd1770->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w)); m_wd1770->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w)); - MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) + FLOPPY_CONNECTOR(config, "wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true); + FLOPPY_CONNECTOR(config, "wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true); /* econet */ MC6854(config, m_adlc); m_adlc->out_txd_cb().set(ECONET_TAG, FUNC(econet_device::host_data_w)); m_adlc->out_irq_cb().set(FUNC(bbc_state::adlc_irq_w)); - MCFG_ECONET_ADD() - MCFG_ECONET_CLK_CALLBACK(WRITELINE(*this, bbc_state, econet_clk_w)) - MCFG_ECONET_DATA_CALLBACK(WRITELINE("mc6854", mc6854_device, set_rx)) - MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr) + + econet_device &econet(ECONET(config, "econet", 0)); + econet.clk_wr_callback().set(m_adlc, FUNC(mc6854_device::txc_w)); + econet.clk_wr_callback().append(m_adlc, FUNC(mc6854_device::rxc_w)); + econet.data_wr_callback().set(m_adlc, FUNC(mc6854_device::set_rx)); + + econet_slot_device &econet_slot(ECONET_SLOT(config, "econet254", 0)); + econet_devices(econet_slot); + econet_slot.set_slot(254); /* analogue port */ - MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, nullptr) + BBC_ANALOGUE_SLOT(config, m_analog, bbc_analogue_devices, nullptr); /* 1mhz bus port */ - MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbc_1mhzbus_devices, nullptr) - MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<3>)) - MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(*this, bbc_state, bus_nmi_w)) + BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbc_1mhzbus_devices, nullptr); + m_1mhzbus->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<3>)); + m_1mhzbus->nmi_handler().set(FUNC(bbc_state::bus_nmi_w)); /* tube ports */ - MCFG_BBC_TUBE_SLOT_ADD("intube", bbc_intube_devices, nullptr) - MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<4>)) - MCFG_BBC_TUBE_SLOT_ADD("extube", bbc_extube_devices, nullptr) - MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<5>)) + BBC_TUBE_SLOT(config, m_intube, bbc_intube_devices, nullptr); + m_intube->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<4>)); + BBC_TUBE_SLOT(config, m_extube, bbc_extube_devices, nullptr); + m_extube->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<5>)); /* user port */ - MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr) - MCFG_BBC_USERPORT_CB1_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb1)) - MCFG_BBC_USERPORT_CB2_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb2)) + BBC_USERPORT_SLOT(config, m_userport, bbc_userport_devices, nullptr); + m_userport->cb1_handler().set(m_via6522_1, FUNC(via6522_device::write_cb1)); + m_userport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2)); MACHINE_CONFIG_END -MACHINE_CONFIG_START(bbc_state::bbcmt) +void bbc_state::bbcmt(machine_config &config) +{ bbcm(config); /* Acorn 65C102 co-processor */ - MCFG_DEVICE_MODIFY("intube") - MCFG_SLOT_DEFAULT_OPTION("65c102") - MCFG_SLOT_FIXED(true) -MACHINE_CONFIG_END + m_intube->set_default_option("65c102"); + m_intube->set_fixed(true); +} -MACHINE_CONFIG_START(bbc_state::bbcmaiv) +void bbc_state::bbcmaiv(machine_config &config) +{ bbcm(config); /* Acorn 65C102 co-processor */ - MCFG_DEVICE_MODIFY("intube") - MCFG_SLOT_DEFAULT_OPTION("65c102") - MCFG_SLOT_FIXED(true) + m_intube->set_default_option("65c102"); + m_intube->set_fixed(true); /* Add Philips VP415 Laserdisc player */ /* Acorn Tracker Ball */ - MCFG_DEVICE_MODIFY("userport") - MCFG_SLOT_DEFAULT_OPTION("tracker") -MACHINE_CONFIG_END + m_userport->set_default_option("tracker"); +} -MACHINE_CONFIG_START(bbc_state::bbcmet) +void bbc_state::bbcmet(machine_config &config) +{ bbcm(config); /* printer */ - MCFG_DEVICE_REMOVE("centronics") - MCFG_DEVICE_REMOVE("cent_data_out") + config.device_remove("centronics"); + config.device_remove("cent_data_out"); /* cassette */ - MCFG_DEVICE_REMOVE("cassette") + config.device_remove("cassette"); /* software lists */ - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig") + config.device_remove("cass_ls_m"); + config.device_remove("cass_ls_a"); + config.device_remove("cass_ls_b"); + config.device_remove("flop_ls_m"); + config.device_remove("flop_ls_b"); + config.device_remove("flop_ls_b_orig"); /* acia */ - MCFG_DEVICE_REMOVE("acia6850") - MCFG_DEVICE_REMOVE(RS232_TAG) - MCFG_DEVICE_REMOVE("acia_clock") + config.device_remove("acia6850"); + config.device_remove(RS232_TAG); + config.device_remove("acia_clock"); /* devices */ - MCFG_DEVICE_REMOVE("upd7002") - MCFG_DEVICE_REMOVE("via6522_1") + config.device_remove("upd7002"); + config.device_remove("via6522_1"); /* fdc */ config.device_remove("wd1770"); - /* expansion ports */ - MCFG_DEVICE_REMOVE("analogue") - MCFG_DEVICE_REMOVE("extube") - MCFG_DEVICE_REMOVE("1mhzbus") - MCFG_DEVICE_REMOVE("userport") -MACHINE_CONFIG_END + /* expansion ports (not fitted) */ + config.device_remove("analogue"); + config.device_remove("extube"); + config.device_remove("1mhzbus"); + config.device_remove("userport"); +} -MACHINE_CONFIG_START(bbc_state::bbcm512) +void bbc_state::bbcm512(machine_config &config) +{ bbcm(config); /* Acorn Intel 80186 co-processor */ - MCFG_DEVICE_MODIFY("intube") - MCFG_SLOT_DEFAULT_OPTION("80186") - MCFG_SLOT_FIXED(true) + m_intube->set_default_option("80186"); + m_intube->set_fixed(true); /* Acorn Mouse */ - MCFG_DEVICE_MODIFY("userport") - MCFG_SLOT_DEFAULT_OPTION("m512mouse") -MACHINE_CONFIG_END + m_userport->set_default_option("m512mouse"); +} -MACHINE_CONFIG_START(bbc_state::bbcmarm) +void bbc_state::bbcmarm(machine_config &config) +{ bbcm(config); /* Acorn ARM co-processor */ - MCFG_DEVICE_MODIFY("extube") - MCFG_SLOT_DEFAULT_OPTION("arm") - MCFG_SLOT_FIXED(true) -MACHINE_CONFIG_END + m_extube->set_default_option("arm"); + m_extube->set_fixed(true); +} -MACHINE_CONFIG_START(bbc_state::discmon) +void bbc_state::discmon(machine_config &config) +{ bbcm(config); /* Add coin slot */ /* software lists */ - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig") -MACHINE_CONFIG_END + config.device_remove("cass_ls_m"); + config.device_remove("cass_ls_a"); + config.device_remove("cass_ls_b"); + config.device_remove("flop_ls_m"); + config.device_remove("flop_ls_b"); + config.device_remove("flop_ls_b_orig"); +} -MACHINE_CONFIG_START(bbc_state::discmate) +void bbc_state::discmate(machine_config &config) +{ bbcm(config); /* Add Sony CDK-3000PII Auto Disc Loader */ /* Add interface boards connected to cassette and RS423 */ /* software lists */ - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig") -MACHINE_CONFIG_END + config.device_remove("cass_ls_m"); + config.device_remove("cass_ls_a"); + config.device_remove("cass_ls_b"); + config.device_remove("flop_ls_m"); + config.device_remove("flop_ls_b"); + config.device_remove("flop_ls_b_orig"); +} MACHINE_CONFIG_START(bbc_state::cfa3000) @@ -1582,24 +1556,21 @@ MACHINE_CONFIG_START(bbc_state::cfa3000) MCFG_DEVICE_SLOT_INTERFACE(bbc_floppies_525, nullptr, false) /* keyboard */ - MCFG_DEVICE_MODIFY("userport") - MCFG_SLOT_DEFAULT_OPTION("cfa3000kbd") + m_userport->set_default_option("cfa3000kbd"); /* option board */ - MCFG_DEVICE_MODIFY("1mhzbus") - MCFG_SLOT_DEFAULT_OPTION("cfa3000opt") + m_1mhzbus->set_default_option("cfa3000opt"); /* analogue dials/sensors */ - MCFG_DEVICE_MODIFY("analogue") - MCFG_SLOT_DEFAULT_OPTION("cfa3000a") + m_analog->set_default_option("cfa3000a"); /* software lists */ - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig") + config.device_remove("cass_ls_m"); + config.device_remove("cass_ls_a"); + config.device_remove("cass_ls_b"); + config.device_remove("flop_ls_m"); + config.device_remove("flop_ls_b"); + config.device_remove("flop_ls_b_orig"); MACHINE_CONFIG_END @@ -1613,22 +1584,20 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(bbc_state::bbcmc) bbcm(config); /* cassette */ - MCFG_DEVICE_REMOVE("cassette") + config.device_remove("cassette"); /* fdc */ config.device_remove("wd1770"); - wd1772_device& wd1772(WD1772(config, "wd1772", 16_MHz_XTAL / 2)); - wd1772.intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w)); - wd1772.drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w)); + WD1772(config, m_wd1772, 16_MHz_XTAL / 2); + m_wd1772->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w)); + m_wd1772->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w)); - MCFG_FLOPPY_DRIVE_ADD_FIXED("wd1772:0", bbc_floppies_35, "35dd", bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("wd1772:1", bbc_floppies_35, nullptr, bbc_state::floppy_formats_bbc) - MCFG_FLOPPY_DRIVE_SOUND(true) + FLOPPY_CONNECTOR(config, "wd1772:0", bbc_floppies_35, "35dd", bbc_state::floppy_formats_bbc, true).enable_sound(true); + FLOPPY_CONNECTOR(config, "wd1772:1", bbc_floppies_35, nullptr, bbc_state::floppy_formats_bbc).enable_sound(true); /* eeprom pcd8572 */ - //MCFG_DEVICE_REMOVE("rtc") + //config.device_remove("rtc"); MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcmc) MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcmc) @@ -1639,39 +1608,40 @@ MACHINE_CONFIG_START(bbc_state::bbcmc) m_via6522_1->writepb_handler().set("joyport", FUNC(bbc_joyport_slot_device::pb_w)); /* cartridge sockets */ - MCFG_DEVICE_REMOVE("exp_rom1") - MCFG_DEVICE_REMOVE("exp_rom2") + config.device_remove("exp_rom1"); + config.device_remove("exp_rom2"); /* software lists */ - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") - MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig") - MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m") - MCFG_SOFTWARE_LIST_ADD("flop_ls_mc", "bbcmc_flop") - MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_pro128s", "pro128s_flop") + config.device_remove("cass_ls_m"); + config.device_remove("cass_ls_a"); + config.device_remove("cass_ls_b"); + config.device_remove("flop_ls_m"); + config.device_remove("flop_ls_b"); + config.device_remove("flop_ls_b_orig"); + config.device_remove("cart_ls_m"); + SOFTWARE_LIST(config, "flop_ls_mc").set_original("bbcmc_flop"); + SOFTWARE_LIST(config, "flop_ls_pro128s").set_compatible("pro128s_flop"); /* expansion ports */ - MCFG_BBC_JOYPORT_ADD("joyport", bbc_joyport_devices, "joystick") - MCFG_BBC_JOYPORT_CB1_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb1)) - MCFG_BBC_JOYPORT_CB2_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb2)) + BBC_JOYPORT_SLOT(config, m_joyport, bbc_joyport_devices, "joystick"); + m_joyport->cb1_handler().set(m_via6522_1, FUNC(via6522_device::write_cb1)); + m_joyport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2)); - MCFG_DEVICE_REMOVE("analogue") - MCFG_DEVICE_REMOVE("intube") - MCFG_DEVICE_REMOVE("extube") + config.device_remove("analogue"); + config.device_remove("intube"); + config.device_remove("extube"); MACHINE_CONFIG_END -MACHINE_CONFIG_START(bbc_state::pro128s) +void bbc_state::pro128s(machine_config &config) +{ bbcmc(config); /* software lists */ - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_mc") - MCFG_SOFTWARE_LIST_REMOVE("flop_ls_pro128s") - MCFG_SOFTWARE_LIST_ADD("flop_ls_pro128s", "pro128s_flop") - MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_mc", "bbcmc_flop") -MACHINE_CONFIG_END + config.device_remove("flop_ls_mc"); + config.device_remove("flop_ls_pro128s"); + SOFTWARE_LIST(config, "flop_ls_pro128s").set_original("pro128s_flop"); + SOFTWARE_LIST(config, "flop_ls_mc").set_compatible("bbcmc_flop"); +} /*************************************************************************** diff --git a/src/mame/drivers/bingoc.cpp b/src/mame/drivers/bingoc.cpp index f4b3e9c3296..51266ba6d62 100644 --- a/src/mame/drivers/bingoc.cpp +++ b/src/mame/drivers/bingoc.cpp @@ -129,22 +129,14 @@ WRITE8_MEMBER(bingoc_state::sound_play_w) void bingoc_state::main_map(address_map &map) { map(0x000000, 0x03ffff).rom(); - map(0x100001, 0x100001).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x100003, 0x100003).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x100009, 0x100009).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x10000b, 0x10000b).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x100011, 0x100011).rw("uart3", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x100013, 0x100013).rw("uart3", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x100019, 0x100019).rw("uart4", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x10001b, 0x10001b).rw("uart4", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x100021, 0x100021).rw("uart5", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x100023, 0x100023).rw("uart5", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x100029, 0x100029).rw("uart6", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x10002b, 0x10002b).rw("uart6", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x100031, 0x100031).rw("uart7", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x100033, 0x100033).rw("uart7", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x100039, 0x100039).rw("uart8", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x10003b, 0x10003b).rw("uart8", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x100000, 0x100003).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x100008, 0x10000b).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x100010, 0x100013).rw("uart3", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x100018, 0x10001b).rw("uart4", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x100020, 0x100023).rw("uart5", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x100028, 0x10002b).rw("uart6", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x100030, 0x100033).rw("uart7", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x100038, 0x10003b).rw("uart8", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0x180000, 0x18001f).rw("io", FUNC(sega_315_5338a_device::read), FUNC(sega_315_5338a_device::write)).umask16(0x00ff); //lamps? #if 0 // !SOUND_TEST map(0x180010, 0x180011).w(FUNC(bingoc_state::main_sound_latch_w)); //WRONG there... diff --git a/src/mame/drivers/bw2.cpp b/src/mame/drivers/bw2.cpp index 55dd940c817..564a3d000af 100644 --- a/src/mame/drivers/bw2.cpp +++ b/src/mame/drivers/bw2.cpp @@ -191,8 +191,7 @@ void bw2_state::bw2_io(address_map &map) map(0x10, 0x13).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x20, 0x21).m(m_lcdc, FUNC(msm6255_device::map)); map(0x30, 0x3f).rw(m_exp, FUNC(bw2_expansion_slot_device::slot_r), FUNC(bw2_expansion_slot_device::slot_w)); - map(0x40, 0x40).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x41, 0x41).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x40, 0x41).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x50, 0x50).w("cent_data_out", FUNC(output_latch_device::bus_w)); map(0x60, 0x63).rw(m_fdc, FUNC(wd2797_device::read), FUNC(wd2797_device::write)); map(0x70, 0x7f).rw(m_exp, FUNC(bw2_expansion_slot_device::modsel_r), FUNC(bw2_expansion_slot_device::modsel_w)); diff --git a/src/mame/drivers/cgc7900.cpp b/src/mame/drivers/cgc7900.cpp index 6b02457a645..d14c727179c 100644 --- a/src/mame/drivers/cgc7900.cpp +++ b/src/mame/drivers/cgc7900.cpp @@ -347,10 +347,8 @@ void cgc7900_state::cgc7900_mem(address_map &map) // AM_RANGE(0xefc446, 0xefc447) HVG Load dY // AM_RANGE(0xefc448, 0xefc449) HVG Load Pixel Color // AM_RANGE(0xefc44a, 0xefc44b) HVG Load Trip - map(0xff8001, 0xff8001).rw(m_i8251_0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xff8003, 0xff8003).rw(m_i8251_0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xff8041, 0xff8041).rw(m_i8251_1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xff8043, 0xff8043).rw(m_i8251_1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xff8000, 0xff8003).rw(m_i8251_0, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0xff8040, 0xff8043).rw(m_i8251_1, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0xff8080, 0xff8081).rw(FUNC(cgc7900_state::keyboard_r), FUNC(cgc7900_state::keyboard_w)); // AM_RANGE(0xff80c6, 0xff80c7) Joystick X axis // AM_RANGE(0xff80ca, 0xff80cb) Joystick Y axis diff --git a/src/mame/drivers/cit101.cpp b/src/mame/drivers/cit101.cpp index 62848c4adbd..0f450b1276b 100644 --- a/src/mame/drivers/cit101.cpp +++ b/src/mame/drivers/cit101.cpp @@ -306,12 +306,9 @@ void cit101_state::mem_map(address_map &map) map(0x8000, 0xbfff).ram().share("extraram"); // only 4 bits wide? map(0x8000, 0x8000).w(FUNC(cit101_state::screen_control_w)); map(0xc000, 0xdfff).rw(FUNC(cit101_state::c000_ram_r), FUNC(cit101_state::c000_ram_w)); - map(0xfc00, 0xfc00).rw("auxuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xfc01, 0xfc01).rw("auxuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xfc20, 0xfc20).rw("comuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xfc21, 0xfc21).rw("comuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xfc40, 0xfc40).rw("kbduart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xfc41, 0xfc41).rw("kbduart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xfc00, 0xfc01).rw("auxuart", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0xfc20, 0xfc21).rw("comuart", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0xfc40, 0xfc41).rw("kbduart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xfc60, 0xfc63).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xfc80, 0xfc83).w("pit0", FUNC(pit8253_device::write)); map(0xfcc0, 0xfcc3).w("pit1", FUNC(pit8253_device::write)); @@ -319,12 +316,9 @@ void cit101_state::mem_map(address_map &map) void cit101_state::io_map(address_map &map) { - map(0x00, 0x00).rw("auxuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x01, 0x01).rw("auxuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x20, 0x20).rw("comuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x21, 0x21).rw("comuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x40, 0x40).rw("kbduart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x41, 0x41).rw("kbduart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x00, 0x01).rw("auxuart", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x20, 0x21).rw("comuart", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x40, 0x41).rw("kbduart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x60, 0x63).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xa0, 0xa0).w(FUNC(cit101_state::brightness_w)); map(0xe0, 0xe0).rw(FUNC(cit101_state::e0_latch_r), FUNC(cit101_state::e0_latch_w)); diff --git a/src/mame/drivers/cit220.cpp b/src/mame/drivers/cit220.cpp index 851c8fd4309..17ce79680d7 100644 --- a/src/mame/drivers/cit220.cpp +++ b/src/mame/drivers/cit220.cpp @@ -70,8 +70,7 @@ void cit220_state::mem_map(address_map &map) void cit220_state::io_map(address_map &map) { map(0x00, 0x0f).rw("duart", FUNC(scn2681_device::read), FUNC(scn2681_device::write)); - map(0x10, 0x10).rw("usart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x11, 0x11).rw("usart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x10, 0x11).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x20, 0x27).rw("avdc", FUNC(scn2674_device::read), FUNC(scn2674_device::write)); map(0xa0, 0xa0).rw("avdc", FUNC(scn2674_device::attr_buffer_r), FUNC(scn2674_device::attr_buffer_w)); map(0xc0, 0xc0).rw("avdc", FUNC(scn2674_device::buffer_r), FUNC(scn2674_device::buffer_w)); diff --git a/src/mame/drivers/compis.cpp b/src/mame/drivers/compis.cpp index ce70b1e4a79..a7ad6f25013 100644 --- a/src/mame/drivers/compis.cpp +++ b/src/mame/drivers/compis.cpp @@ -203,14 +203,7 @@ READ16_MEMBER( compis_state::pcs6_2_3_r ) } else { - if (BIT(offset, 0)) - { - return m_uart->status_r(space, 0) << 8; - } - else - { - return m_uart->data_r(space, 0) << 8; - } + return m_uart->read(offset & 1) << 8; } } @@ -221,14 +214,7 @@ WRITE16_MEMBER( compis_state::pcs6_2_3_w ) } else { - if (BIT(offset, 0)) - { - m_uart->control_w(space, 0, data >> 8); - } - else - { - m_uart->data_w(space, 0, data >> 8); - } + m_uart->write(offset & 1, data >> 8); } } diff --git a/src/mame/drivers/decwritr.cpp b/src/mame/drivers/decwritr.cpp index 46c0f0be4f7..e1e2b450db7 100644 --- a/src/mame/drivers/decwritr.cpp +++ b/src/mame/drivers/decwritr.cpp @@ -255,8 +255,7 @@ void decwriter_state::la120_mem(address_map &map) void decwriter_state::la120_io(address_map &map) { map.unmap_value_high(); - map(0x00, 0x00).mirror(0x7C).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); // 8251 Data - map(0x01, 0x01).mirror(0x7C).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); // 8251 Status/Control + map(0x00, 0x01).mirror(0x7C).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); // 8251 Status/Control //map(0x02, 0x02).mirror(0x7D); // other io ports, serial loopback etc, see table 4-9 in TM // 0x80-0xff are reserved for expansion (i.e. unused, open bus) map.global_mask(0xff); @@ -462,7 +461,7 @@ MACHINE_CONFIG_START(decwriter_state::la120) MCFG_RS232_DSR_HANDLER(WRITELINE("usart", i8251_device, write_dsr)) */ - MCFG_DEVICE_ADD("nvm", ER1400, 0) + ER1400(config, m_nvm); MACHINE_CONFIG_END diff --git a/src/mame/drivers/duet16.cpp b/src/mame/drivers/duet16.cpp index 382be0445b9..a66c507484d 100644 --- a/src/mame/drivers/duet16.cpp +++ b/src/mame/drivers/duet16.cpp @@ -157,8 +157,7 @@ void duet16_state::duet16_mem(address_map &map) map(0xf8040, 0xf804f).rw("itm", FUNC(ptm6840_device::read), FUNC(ptm6840_device::write)).umask16(0x00ff); map(0xf8060, 0xf8067).rw("bgpit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); map(0xf8080, 0xf8087).rw("sio", FUNC(upd7201_new_device::ba_cd_r), FUNC(upd7201_new_device::ba_cd_w)).umask16(0x00ff); - map(0xf80a0, 0xf80a0).rw("kbusart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf80a2, 0xf80a2).rw("kbusart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf80a0, 0xf80a3).rw("kbusart", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0xf80c0, 0xf80c0).rw("crtc", FUNC(h46505_device::status_r), FUNC(h46505_device::address_w)); map(0xf80c2, 0xf80c2).rw("crtc", FUNC(h46505_device::register_r), FUNC(h46505_device::register_w)); map(0xf80e0, 0xf80e3).rw("i8741", FUNC(upi41_cpu_device::upi41_master_r), FUNC(upi41_cpu_device::upi41_master_w)).umask16(0x00ff); diff --git a/src/mame/drivers/dvk_ksm.cpp b/src/mame/drivers/dvk_ksm.cpp index cc9e8188705..7f2ce0b4754 100644 --- a/src/mame/drivers/dvk_ksm.cpp +++ b/src/mame/drivers/dvk_ksm.cpp @@ -174,10 +174,8 @@ void ksm_state::ksm_io(address_map &map) { map.unmap_value_high(); map(0x5e, 0x5f).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); - map(0x6e, 0x6e).rw(m_i8251kbd, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x6f, 0x6f).rw(m_i8251kbd, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x76, 0x76).rw(m_i8251line, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x77, 0x77).rw(m_i8251line, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x6e, 0x6f).rw(m_i8251kbd, FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x76, 0x77).rw(m_i8251line, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x78, 0x7b).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)); } diff --git a/src/mame/drivers/ec7915.cpp b/src/mame/drivers/ec7915.cpp index 37edfc352fa..e2e8de9a3fb 100644 --- a/src/mame/drivers/ec7915.cpp +++ b/src/mame/drivers/ec7915.cpp @@ -46,8 +46,7 @@ void ec7915_state::io_map(address_map &map) { map(0x00, 0x03).rw("ppi1", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x04, 0x07).rw("ppi2", FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0x08, 0x08).rw("usart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x09, 0x09).rw("usart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x08, 0x09).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x0c, 0x0f).rw("ppi3", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x10, 0x13).w("pit", FUNC(pit8253_device::write)); //map(0x14, 0x14).w("picu", FUNC(i8214_device::write)); diff --git a/src/mame/drivers/ecoinfr.cpp b/src/mame/drivers/ecoinfr.cpp index bd7facf240d..18cc6751b29 100644 --- a/src/mame/drivers/ecoinfr.cpp +++ b/src/mame/drivers/ecoinfr.cpp @@ -488,8 +488,7 @@ void ecoinfr_state::memmap(address_map &map) map(0x0000, 0x7fff).rom(); map(0x8000, 0x9fff).ram(); - map(0xa000, 0xa000).rw(UPD8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xa001, 0xa001).rw(UPD8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xa000, 0xa001).rw(UPD8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)); } diff --git a/src/mame/drivers/einstein.cpp b/src/mame/drivers/einstein.cpp index 7b5a7951cd0..a284efde7fc 100644 --- a/src/mame/drivers/einstein.cpp +++ b/src/mame/drivers/einstein.cpp @@ -430,8 +430,7 @@ void einstein_state::einstein_io(address_map &map) map(0x03, 0x03).mirror(0xff04).w(m_psg, FUNC(ay8910_device::data_w)); map(0x08, 0x08).mirror(0xff06).rw("vdp", FUNC(tms9129_device::vram_r), FUNC(tms9129_device::vram_w)); map(0x09, 0x09).mirror(0xff06).rw("vdp", FUNC(tms9129_device::register_r), FUNC(tms9129_device::register_w)); - map(0x10, 0x10).mirror(0xff06).rw(IC_I060, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x11, 0x11).mirror(0xff06).rw(IC_I060, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x10, 0x11).mirror(0xff06).rw(IC_I060, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x18, 0x1b).mirror(0xff04).rw(m_fdc, FUNC(wd1770_device::read), FUNC(wd1770_device::write)); map(0x20, 0x20).mirror(0xff00).rw(FUNC(einstein_state::kybint_msk_r), FUNC(einstein_state::kybint_msk_w)); map(0x21, 0x21).mirror(0xff00).w(FUNC(einstein_state::adcint_msk_w)); diff --git a/src/mame/drivers/elwro800.cpp b/src/mame/drivers/elwro800.cpp index 3cc87788e42..295fe086310 100644 --- a/src/mame/drivers/elwro800.cpp +++ b/src/mame/drivers/elwro800.cpp @@ -294,14 +294,7 @@ READ8_MEMBER(elwro800_state::elwro800jr_io_r) else if (!BIT(cs,4)) { // CS51 - if (offset & 1) - { - return m_i8251->status_r(space, 0); - } - else - { - return m_i8251->data_r(space, 0); - } + return m_i8251->read(offset & 1); } else if (!BIT(cs,5)) { @@ -345,14 +338,7 @@ WRITE8_MEMBER(elwro800_state::elwro800jr_io_w) else if (!BIT(cs,4)) { // CS51 - if (offset & 1) - { - m_i8251->control_w(space, 0, data); - } - else - { - m_i8251->data_w(space, 0, data); - } + m_i8251->write(offset & 1, data); } else if (!BIT(cs,5)) { diff --git a/src/mame/drivers/excali64.cpp b/src/mame/drivers/excali64.cpp index 037615aee37..8111dc96b40 100644 --- a/src/mame/drivers/excali64.cpp +++ b/src/mame/drivers/excali64.cpp @@ -136,8 +136,7 @@ void excali64_state::io_map(address_map &map) { map.global_mask(0xff); map(0x00, 0x0f).r(FUNC(excali64_state::port00_r)); - map(0x10, 0x10).mirror(0x0e).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x11, 0x11).mirror(0x0e).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x10, 0x11).mirror(0x0e).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x20, 0x23).mirror(0x0c).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x30, 0x30).mirror(0x0e).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)); map(0x31, 0x31).mirror(0x0e).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); diff --git a/src/mame/drivers/facit4440.cpp b/src/mame/drivers/facit4440.cpp index c5cb37d6819..03bd9221e7e 100644 --- a/src/mame/drivers/facit4440.cpp +++ b/src/mame/drivers/facit4440.cpp @@ -137,7 +137,7 @@ u8 facit4440_state::misc_status_r() WRITE_LINE_MEMBER(facit4440_state::vsync_w) { - if (BIT(m_control_latch[0], 5)) + if (state && BIT(m_control_latch[0], 5)) m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } diff --git a/src/mame/drivers/fanucspmg.cpp b/src/mame/drivers/fanucspmg.cpp index b367305eaa9..a444ee32f8b 100644 --- a/src/mame/drivers/fanucspmg.cpp +++ b/src/mame/drivers/fanucspmg.cpp @@ -728,14 +728,10 @@ void fanucspmg_state::maincpu_mem(address_map &map) map(0xf0000, 0xf0003).rw(m_pic0, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); map(0xf0004, 0xf0007).m(m_fdc, FUNC(upd765a_device::map)).umask16(0x00ff); map(0xf0008, 0xf000f).rw(m_pit0, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); - map(0xf0010, 0xf0010).rw(m_usart0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf0012, 0xf0012).rw(m_usart0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xf0014, 0xf0014).rw(m_usart1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf0016, 0xf0016).rw(m_usart1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xf0018, 0xf0018).rw(m_usart2, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf001a, 0xf001a).rw(m_usart2, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xf001c, 0xf001c).rw(m_usart3, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf001e, 0xf001e).rw(m_usart3, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf0010, 0xf0013).rw(m_usart0, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0xf0014, 0xf0017).rw(m_usart1, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0xf0018, 0xf001b).rw(m_usart2, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0xf001c, 0xf001f).rw(m_usart3, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0xf0020, 0xf0029).rw(m_dmac, FUNC(i8257_device::read), FUNC(i8257_device::write)); map(0xf0042, 0xf0043).r(FUNC(fanucspmg_state::magic_r)); map(0xf0046, 0xf0046).w(FUNC(fanucspmg_state::dma_page_w)); diff --git a/src/mame/drivers/fb01.cpp b/src/mame/drivers/fb01.cpp index fc1834ccb0a..018714dbb66 100644 --- a/src/mame/drivers/fb01.cpp +++ b/src/mame/drivers/fb01.cpp @@ -82,8 +82,7 @@ void fb01_state::fb01_io(address_map &map) map(0x01, 0x01).rw("ym2164", FUNC(ym2151_device::status_r), FUNC(ym2151_device::data_w)); // 10-11 USART uPD71051C 4MHz & 4MHz / 8 - map(0x10, 0x10).rw(m_upd71051, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x11, 0x11).rw(m_upd71051, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x10, 0x11).rw(m_upd71051, FUNC(i8251_device::read), FUNC(i8251_device::write)); // 20 PANEL SWITCH map(0x20, 0x20).portr("PANEL"); diff --git a/src/mame/drivers/fk1.cpp b/src/mame/drivers/fk1.cpp index 16b8bde9d5f..982f5155c43 100644 --- a/src/mame/drivers/fk1.cpp +++ b/src/mame/drivers/fk1.cpp @@ -328,8 +328,7 @@ void fk1_state::fk1_io(address_map &map) map(0x10, 0x13).rw("pit8253", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x20, 0x23).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x30, 0x30).rw(FUNC(fk1_state::fk1_bank_ram_r), FUNC(fk1_state::fk1_intr_w)); - map(0x40, 0x40).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x41, 0x41).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x40, 0x41).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x50, 0x50).rw(FUNC(fk1_state::fk1_bank_rom_r), FUNC(fk1_state::fk1_disk_w)); map(0x60, 0x63).rw("ppi8255_3", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x70, 0x70).rw(FUNC(fk1_state::fk1_mouse_r), FUNC(fk1_state::fk1_reset_int_w)); diff --git a/src/mame/drivers/fmtowns.cpp b/src/mame/drivers/fmtowns.cpp index 62681fb91b2..656db340a54 100644 --- a/src/mame/drivers/fmtowns.cpp +++ b/src/mame/drivers/fmtowns.cpp @@ -2122,10 +2122,8 @@ WRITE8_MEMBER( towns_state::towns_serial_w ) switch(offset) { case 0: - m_i8251->data_w(space,0,data); - break; case 1: - m_i8251->control_w(space,0,data); + m_i8251->write(offset, data); break; case 4: m_serial_irq_enable = data; @@ -2140,9 +2138,8 @@ READ8_MEMBER( towns_state::towns_serial_r ) switch(offset) { case 0: - return m_i8251->data_r(space,0); case 1: - return m_i8251->status_r(space,0); + return m_i8251->read(offset); case 3: return m_serial_irq_source; default: diff --git a/src/mame/drivers/h8.cpp b/src/mame/drivers/h8.cpp index eca8a3cdb83..188e2a7ebaa 100644 --- a/src/mame/drivers/h8.cpp +++ b/src/mame/drivers/h8.cpp @@ -197,11 +197,9 @@ void h8_state::h8_io(address_map &map) map.global_mask(0xff); map(0xf0, 0xf0).rw(FUNC(h8_state::portf0_r), FUNC(h8_state::portf0_w)); map(0xf1, 0xf1).w(FUNC(h8_state::portf1_w)); - map(0xf8, 0xf8).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf9, 0xf9).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf8, 0xf9).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write)); // optional connection to a serial terminal @ 600 baud - //AM_RANGE(0xfa, 0xfa) AM_DEVREADWRITE("uart1", i8251_device, data_r, data_w) - //AM_RANGE(0xfb, 0xfb) AM_DEVREADWRITE("uart1", i8251_device, status_r, control_w) + //map(0xfa, 0xfb).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); } /* Input ports */ diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp index b224001112a..f103d4edde6 100644 --- a/src/mame/drivers/hh_sm510.cpp +++ b/src/mame/drivers/hh_sm510.cpp @@ -1205,6 +1205,7 @@ MACHINE_CONFIG_START(gnw_mickdon_state::gnw_mickdon) MCFG_SCREEN_VISIBLE_AREA(0, 1920/2-1, 0, 1236/2-1) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_sm510_state, display_decay_tick, attotime::from_msec(1)) + config.set_default_layout(layout_gnw_dualv); /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -1288,6 +1289,7 @@ MACHINE_CONFIG_START(gnw_dkong2_state::gnw_dkong2) MCFG_SCREEN_VISIBLE_AREA(0, 1920/2-1, 0, 1237/2-1) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_sm510_state, display_decay_tick, attotime::from_msec(1)) + config.set_default_layout(layout_gnw_dualv); /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -1373,6 +1375,7 @@ MACHINE_CONFIG_START(gnw_mario_state::gnw_mario) MCFG_SCREEN_VISIBLE_AREA(0, 2261/2-1, 0, 1440/2-1) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_sm510_state, display_decay_tick, attotime::from_msec(1)) + config.set_default_layout(layout_gnw_dualh); /* sound hardware */ SPEAKER(config, "mono").front_center(); diff --git a/src/mame/drivers/hp64k.cpp b/src/mame/drivers/hp64k.cpp index 9528f53c968..2034176ae86 100644 --- a/src/mame/drivers/hp64k.cpp +++ b/src/mame/drivers/hp64k.cpp @@ -961,13 +961,7 @@ void hp64k_state::hp64k_floppy_wpt_cb(floppy_image_device *floppy , int state) READ16_MEMBER(hp64k_state::hp64k_usart_r) { - uint16_t tmp; - - if ((offset & 1) == 0) { - tmp = m_uart->status_r(space , 0); - } else { - tmp = m_uart->data_r(space , 0); - } + uint16_t tmp = m_uart->read(~offset & 1); // bit 8 == bit 7 rear panel switches (modem/terminal) ??? @@ -982,11 +976,7 @@ READ16_MEMBER(hp64k_state::hp64k_usart_r) WRITE16_MEMBER(hp64k_state::hp64k_usart_w) { - if ((offset & 1) == 0) { - m_uart->control_w(space , 0 , (uint8_t)(data & 0xff)); - } else { - m_uart->data_w(space , 0 , (uint8_t)(data & 0xff)); - } + m_uart->write(~offset & 1, data & 0xff); } WRITE_LINE_MEMBER(hp64k_state::hp64k_rxrdy_w) diff --git a/src/mame/drivers/ibm6580.cpp b/src/mame/drivers/ibm6580.cpp index 1abb11bda65..9512ff266da 100644 --- a/src/mame/drivers/ibm6580.cpp +++ b/src/mame/drivers/ibm6580.cpp @@ -701,10 +701,8 @@ void ibm6580_state::ibm6580_io(address_map &map) map(0x0040, 0x005f).rw(FUNC(ibm6580_state::p40_r), FUNC(ibm6580_state::p40_w)).umask16(0x00ff); map(0x0070, 0x007f).unmaprw(); map(0x0120, 0x0127).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); - map(0x0140, 0x0140).rw("upd8251a", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x0142, 0x0142).rw("upd8251a", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x0160, 0x0160).rw("upd8251b", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x0162, 0x0162).rw("upd8251b", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x0140, 0x0143).rw("upd8251a", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x0160, 0x0163).rw("upd8251b", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0x4000, 0x400f).unmaprw(); map(0x5000, 0x500f).unmaprw(); map(0x6000, 0x601f).unmaprw(); diff --git a/src/mame/drivers/ibmpcjr.cpp b/src/mame/drivers/ibmpcjr.cpp index 07774a1eef6..1e6ef97f708 100644 --- a/src/mame/drivers/ibmpcjr.cpp +++ b/src/mame/drivers/ibmpcjr.cpp @@ -20,8 +20,8 @@ #include "bus/generic/slot.h" #include "bus/isa/fdc.h" #include "bus/pc_joy/pc_joy.h" +#include "bus/rs232/hlemouse.h" #include "bus/rs232/rs232.h" -#include "bus/rs232/ser_mouse.h" #include "screen.h" #include "softlist.h" @@ -512,8 +512,11 @@ static void pcjr_floppies(device_slot_interface &device) static void pcjr_com(device_slot_interface &device) { - device.option_add("microsoft_mouse", MSFT_SERIAL_MOUSE); - device.option_add("mousesys_mouse", MSYSTEM_SERIAL_MOUSE); + device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE); + device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE); + device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE); + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); + device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE); } static const gfx_layout pc_8_charlayout = diff --git a/src/mame/drivers/icebox.cpp b/src/mame/drivers/icebox.cpp index b658c38753d..b1052d290fb 100644 --- a/src/mame/drivers/icebox.cpp +++ b/src/mame/drivers/icebox.cpp @@ -169,10 +169,8 @@ void icebox_state::io_map(address_map &map) { map.global_mask(0xff); map.unmap_value_high(); - map(0xe0, 0xe0).rw(m_uart0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xe1, 0xe1).rw(m_uart0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xe2, 0xe2).rw(m_uart1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xe3, 0xe3).rw(m_uart1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xe0, 0xe1).rw(m_uart0, FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0xe2, 0xe3).rw(m_uart1, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xe4, 0xe7).lrw8("fdc_usage", [this](offs_t offset) { return m_fdc->read(offset^3); }, [this](offs_t offset, u8 data) { m_fdc->write(offset^3, data); }); diff --git a/src/mame/drivers/imds2.cpp b/src/mame/drivers/imds2.cpp index b0f44b148c7..777003cbbf1 100644 --- a/src/mame/drivers/imds2.cpp +++ b/src/mame/drivers/imds2.cpp @@ -143,10 +143,8 @@ void imds2_state::ipc_io_map(address_map &map) map.unmap_value_low(); map(0xc0, 0xc1).rw(m_ioc, FUNC(imds2ioc_device::dbb_master_r), FUNC(imds2ioc_device::dbb_master_w)); map(0xf0, 0xf3).rw(m_ipctimer, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); - map(0xf4, 0xf4).rw(m_ipcusart[0], FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf5, 0xf5).rw(m_ipcusart[0], FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xf6, 0xf6).rw(m_ipcusart[1], FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf7, 0xf7).rw(m_ipcusart[1], FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf4, 0xf5).rw(m_ipcusart[0], FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0xf6, 0xf7).rw(m_ipcusart[1], FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xf8, 0xf9).rw(m_ioc, FUNC(imds2ioc_device::pio_master_r), FUNC(imds2ioc_device::pio_master_w)); map(0xfa, 0xfb).rw(FUNC(imds2_state::ipclocpic_r), FUNC(imds2_state::ipclocpic_w)); map(0xfc, 0xfd).rw(FUNC(imds2_state::ipcsyspic_r), FUNC(imds2_state::ipcsyspic_w)); diff --git a/src/mame/drivers/imsai.cpp b/src/mame/drivers/imsai.cpp index d58b9ec0166..327d326ddc6 100644 --- a/src/mame/drivers/imsai.cpp +++ b/src/mame/drivers/imsai.cpp @@ -68,10 +68,8 @@ void imsai_state::imsai_io(address_map &map) map.global_mask(0xff); map(0x02, 0x02).r(FUNC(imsai_state::keyin_r)).w(m_terminal, FUNC(generic_terminal_device::write)); map(0x03, 0x03).r(FUNC(imsai_state::status_r)); - map(0x04, 0x04).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x05, 0x05).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x12, 0x12).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x13, 0x13).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x04, 0x05).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x12, 0x13).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x14, 0x14).r(FUNC(imsai_state::keyin_r)).w(m_terminal, FUNC(generic_terminal_device::write)); map(0x15, 0x15).r(FUNC(imsai_state::status_r)); map(0xf3, 0xf3).w(FUNC(imsai_state::control_w)); diff --git a/src/mame/drivers/ipc.cpp b/src/mame/drivers/ipc.cpp index 339ce3e5a92..b126c30b61a 100644 --- a/src/mame/drivers/ipc.cpp +++ b/src/mame/drivers/ipc.cpp @@ -77,10 +77,8 @@ void ipc_state::ipc_io(address_map &map) map.unmap_value_high(); map.global_mask(0xff); map(0xf0, 0xf3).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); - map(0xf4, 0xf4).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf5, 0xf5).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xf6, 0xf6).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf7, 0xf7).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf4, 0xf5).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0xf6, 0xf7).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); } /* Input ports */ diff --git a/src/mame/drivers/irisha.cpp b/src/mame/drivers/irisha.cpp index b468d88bd40..ed792c68df7 100644 --- a/src/mame/drivers/irisha.cpp +++ b/src/mame/drivers/irisha.cpp @@ -83,8 +83,7 @@ void irisha_state::irisha_mem(address_map &map) void irisha_state::irisha_io(address_map &map) { map(0x04, 0x05).r(FUNC(irisha_state::irisha_keyboard_r)); - map(0x06, 0x06).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x07, 0x07).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x06, 0x07).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x08, 0x0B).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x0C, 0x0F).rw("pic8259", FUNC(pic8259_device::read), FUNC(pic8259_device::write)).mask(0x01); map(0x10, 0x13).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)); diff --git a/src/mame/drivers/isbc.cpp b/src/mame/drivers/isbc.cpp index 052249359c8..9e738703524 100644 --- a/src/mame/drivers/isbc.cpp +++ b/src/mame/drivers/isbc.cpp @@ -135,10 +135,8 @@ void isbc_state::rpc86_io(address_map &map) map(0x00c4, 0x00c7).rw(m_pic_0, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); map(0x00c8, 0x00cf).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); map(0x00d0, 0x00d7).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); - map(0x00d8, 0x00d8).rw(m_uart8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x00da, 0x00da).rw(m_uart8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x00dc, 0x00dc).rw(m_uart8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x00de, 0x00de).rw(m_uart8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x00d8, 0x00db).rw(m_uart8251, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x00dc, 0x00df).rw(m_uart8251, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); } void isbc_state::isbc8605_io(address_map &map) @@ -169,10 +167,8 @@ void isbc_state::isbc_io(address_map &map) map(0x00c4, 0x00c7).rw(m_pic_0, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); map(0x00c8, 0x00cf).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); map(0x00d0, 0x00d7).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); - map(0x00d8, 0x00d8).rw(m_uart8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x00da, 0x00da).rw(m_uart8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x00dc, 0x00dc).rw(m_uart8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x00de, 0x00de).rw(m_uart8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x00d8, 0x00db).rw(m_uart8251, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x00dc, 0x00df).rw(m_uart8251, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); } void isbc_state::isbc286_io(address_map &map) diff --git a/src/mame/drivers/isbc8010.cpp b/src/mame/drivers/isbc8010.cpp index 5535f9bb504..4b36693b786 100644 --- a/src/mame/drivers/isbc8010.cpp +++ b/src/mame/drivers/isbc8010.cpp @@ -106,8 +106,7 @@ void isbc8010_state::isbc8010_io(address_map &map) map.global_mask(0xff); map(0xe4, 0xe7).rw(m_ppi_0, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xe8, 0xeb).rw(m_ppi_1, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0xec, 0xec).mirror(0x02).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xed, 0xed).mirror(0x02).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xec, 0xed).mirror(0x02).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); //AM_RANGE(0xf0, 0xf7) MCS0 - iSBX Multimodule //AM_RANGE(0xf8, 0xff) MCS1 - iSBX Multimodule } diff --git a/src/mame/drivers/isbc8030.cpp b/src/mame/drivers/isbc8030.cpp index 4f7cc6d2ed6..36752136c1f 100644 --- a/src/mame/drivers/isbc8030.cpp +++ b/src/mame/drivers/isbc8030.cpp @@ -79,8 +79,7 @@ void isbc8030_state::isbc8030_io(address_map &map) map(0xd8, 0xd9).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0xdc, 0xdf).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0xe8, 0xeb).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0xec, 0xec).mirror(0x02).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xed, 0xed).mirror(0x02).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xec, 0xed).mirror(0x02).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); } static INPUT_PORTS_START( isbc8030 ) diff --git a/src/mame/drivers/kyocera.cpp b/src/mame/drivers/kyocera.cpp index 4d76285f6d5..6f1838c37fb 100644 --- a/src/mame/drivers/kyocera.cpp +++ b/src/mame/drivers/kyocera.cpp @@ -628,8 +628,7 @@ void tandy200_state::tandy200_io(address_map &map) map(0x90, 0x9f).rw(m_rtc, FUNC(rp5c01_device::read), FUNC(rp5c01_device::write)); // AM_RANGE(0xa0, 0xa0) AM_MIRROR(0x0f) AM_DEVWRITE(TCM5089_TAG, write) map(0xb0, 0xb7).mirror(0x08).rw(I8155_TAG, FUNC(i8155_device::io_r), FUNC(i8155_device::io_w)); - map(0xc0, 0xc0).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xc1, 0xc1).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xc0, 0xc1).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xd0, 0xd0).mirror(0x0f).rw(FUNC(tandy200_state::bank_r), FUNC(tandy200_state::bank_w)); map(0xe0, 0xe0).mirror(0x0f).rw(FUNC(tandy200_state::stbk_r), FUNC(tandy200_state::stbk_w)); map(0xf0, 0xf0).mirror(0x0e).rw(m_lcdc, FUNC(hd61830_device::data_r), FUNC(hd61830_device::data_w)); diff --git a/src/mame/drivers/mbc200.cpp b/src/mame/drivers/mbc200.cpp index bcb7bd74dd4..9038c0eb99e 100644 --- a/src/mame/drivers/mbc200.cpp +++ b/src/mame/drivers/mbc200.cpp @@ -151,13 +151,11 @@ void mbc200_state::mbc200_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); - //AM_RANGE(0xe0, 0xe0) AM_DEVREADWRITE("uart1", i8251_device, data_r, data_w) - //AM_RANGE(0xe1, 0xe1) AM_DEVREADWRITE("uart1", i8251_device, status_r, control_w) + //map(0xe0, 0xe1).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xe0, 0xe1).r(FUNC(mbc200_state::keyboard_r)).nopw(); map(0xe4, 0xe7).rw(m_fdc, FUNC(mb8876_device::read), FUNC(mb8876_device::write)); map(0xe8, 0xeb).rw(m_ppi_m, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0xec, 0xec).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xed, 0xed).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xec, 0xed).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); } diff --git a/src/mame/drivers/mc1502.cpp b/src/mame/drivers/mc1502.cpp index 72bbcb21df6..8c3c7d3cd6c 100644 --- a/src/mame/drivers/mc1502.cpp +++ b/src/mame/drivers/mc1502.cpp @@ -219,8 +219,7 @@ void mc1502_state::mc1502_map(address_map &map) void mc1502_state::mc1502_io(address_map &map) { map(0x0020, 0x0021).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); - map(0x0028, 0x0028).rw(m_upd8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x0029, 0x0029).rw(m_upd8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x0028, 0x0029).rw(m_upd8251, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x0040, 0x0043).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x0060, 0x0063).rw(m_ppi8255n1, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x0068, 0x006B).rw(m_ppi8255n2, FUNC(i8255_device::read), FUNC(i8255_device::write)); // keyboard poll diff --git a/src/mame/drivers/meritum.cpp b/src/mame/drivers/meritum.cpp index 94ef2df1218..84bd6e27743 100644 --- a/src/mame/drivers/meritum.cpp +++ b/src/mame/drivers/meritum.cpp @@ -110,8 +110,7 @@ void meritum_state::io_map(address_map &map) map(0xf0, 0xf3).rw("flopppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xf4, 0xf7).rw("mainppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xf8, 0xfb).rw("mainpit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); - map(0xfc, 0xfc).rw("usart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xfd, 0xfd).rw("usart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xfc, 0xfd).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write)); // map(0xfe, 0xfe) audio interface map(0xff, 0xff).rw(FUNC(meritum_state::port_ff_r), FUNC(meritum_state::port_ff_w)); } diff --git a/src/mame/drivers/mfabfz.cpp b/src/mame/drivers/mfabfz.cpp index 0c9b3aa76f9..fd2c520e10b 100644 --- a/src/mame/drivers/mfabfz.cpp +++ b/src/mame/drivers/mfabfz.cpp @@ -78,18 +78,15 @@ void mfabfz_state::mfabfz_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); - map(0xbe, 0xbe).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xbf, 0xbf).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xfe, 0xfe).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xff, 0xff).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xbe, 0xbf).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0xfe, 0xff).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); } void mfabfz_state::mfabfz85_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); - map(0xfe, 0xfe).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xff, 0xff).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xfe, 0xff).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); } /* Input ports */ diff --git a/src/mame/drivers/mice.cpp b/src/mame/drivers/mice.cpp index 6a49a3e5f0c..4159256be1f 100644 --- a/src/mame/drivers/mice.cpp +++ b/src/mame/drivers/mice.cpp @@ -69,8 +69,7 @@ void mice_state::mice_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); - map(0x50, 0x50).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x51, 0x51).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x50, 0x51).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x60, 0x67).rw("rpt", FUNC(i8155_device::io_r), FUNC(i8155_device::io_w)); map(0x70, 0x73).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); } @@ -88,8 +87,7 @@ void mice_state::mice2_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); - map(0x80, 0x80).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x81, 0x81).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x80, 0x81).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x90, 0x97).rw("rpt", FUNC(i8155_device::io_r), FUNC(i8155_device::io_w)); map(0xa0, 0xa3).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xc0, 0xc3).rw("rttppi1", FUNC(i8255_device::read), FUNC(i8255_device::write)); diff --git a/src/mame/drivers/microdec.cpp b/src/mame/drivers/microdec.cpp index bd1cfb699a9..f8a3d10e8eb 100644 --- a/src/mame/drivers/microdec.cpp +++ b/src/mame/drivers/microdec.cpp @@ -142,10 +142,8 @@ void microdec_state::microdec_io(address_map &map) map(0xf7, 0xf7).rw(FUNC(microdec_state::portf7_r), FUNC(microdec_state::portf7_w)); map(0xf8, 0xf8).w(FUNC(microdec_state::portf8_w)); map(0xfa, 0xfb).m(m_fdc, FUNC(upd765a_device::map)); - map(0xfc, 0xfc).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xfd, 0xfd).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xfe, 0xfe).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xff, 0xff).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xfc, 0xfd).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0xfe, 0xff).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); // AM_RANGE(0xf0, 0xf3) 8253 PIT (md3 only) used as a baud rate generator for serial ports // AM_RANGE(0xf4, 0xf4) Centronics data // AM_RANGE(0xf5, 0xf5) motor check (md1/2) diff --git a/src/mame/drivers/model1.cpp b/src/mame/drivers/model1.cpp index f6221e7382d..5079d0a93f0 100644 --- a/src/mame/drivers/model1.cpp +++ b/src/mame/drivers/model1.cpp @@ -838,7 +838,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(model1_state::model1_interrupt) } } -MACHINE_RESET_MEMBER(model1_state,model1) +void model1_state::machine_reset() { membank("bank1")->set_base(memregion("maincpu")->base() + 0x1000000); irq_init(); @@ -938,8 +938,7 @@ void model1_state::model1_mem(address_map &map) map(0xc00000, 0xc00fff).r(FUNC(model1_state::dpram_r)).w(m_dpram, FUNC(mb8421_device::right_w)).umask16(0x00ff); // 2k*8-bit dual port ram - map(0xc40000, 0xc40000).rw(m_m1uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xc40002, 0xc40002).rw(m_m1uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xc40000, 0xc40003).rw(m_m1uart, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0xd00000, 0xd00001).rw(FUNC(model1_state::v60_copro_ram_adr_r), FUNC(model1_state::v60_copro_ram_adr_w)); map(0xd20000, 0xd20003).w(FUNC(model1_state::v60_copro_ram_w)); @@ -1400,7 +1399,7 @@ ROM_START( swa ) ROM_LOAD32_WORD( "mpr-16480.30", 0x800000, 0x200000, CRC(3185547a) SHA1(9871937372c2c755717802117a3ad39e1a11410e) ) ROM_LOAD32_WORD( "mpr-16481.31", 0x800002, 0x200000, CRC(ce8d76fe) SHA1(0406f0500d19d6707515627b4143f92a9a5db769) ) - ROM_REGION32_LE( 0x200000, "tgp_data", 0 ) /* TGP data roms */ + ROM_REGION32_LE( 0x200000, "copro_data", 0 ) /* TGP data roms */ ROM_LOAD32_BYTE( "mpr-16472.39", 0x000000, 0x80000, CRC(5a0d7553) SHA1(ba8e08e5a0c6b7fbc10084ad7ad3edf61efb0d70) ) ROM_LOAD32_BYTE( "mpr-16473.40", 0x000001, 0x80000, CRC(876c5399) SHA1(be7e40c77a385600941f11c24852cd73c71696f0) ) ROM_LOAD32_BYTE( "mpr-16474.41", 0x000002, 0x80000, CRC(5864a26f) SHA1(be0c22dfff37408f6b401b1970f7fcc6fc7fbcd2) ) @@ -1453,7 +1452,7 @@ ROM_START( wingwar ) ROM_LOAD32_WORD( "mpr-16749.32", 0xc00000, 0x200000, CRC(0e36dc1a) SHA1(4939177a6ac51ca57d0acd118ff14af4f4e438bb) ) ROM_LOAD32_WORD( "mpr-16750.33", 0xc00002, 0x200000, CRC(e4f0b98d) SHA1(e69de2e5ccea2834fb8326bdd61fc6b517bc60b7) ) - ROM_REGION32_LE( 0x200000, "tgp_data", 0 ) /* TGP data roms */ + ROM_REGION32_LE( 0x200000, "copro_data", 0 ) /* TGP data roms */ ROM_LOAD32_BYTE( "mpr-16741.39", 0x000000, 0x80000, CRC(84b2ffd8) SHA1(0eba3855d20b88567c6fa08046e12429664d87cb) ) ROM_LOAD32_BYTE( "mpr-16742.40", 0x000001, 0x80000, CRC(e9cc12bb) SHA1(40c83c968be3b11fad193a00e7b760f074450683) ) ROM_LOAD32_BYTE( "mpr-16739.41", 0x000002, 0x80000, CRC(6c73e98f) SHA1(7b31e62922ab6d0df97c3ecc52b78e6d086c8635) ) @@ -1465,7 +1464,7 @@ wing War (US) Sega game ID# 833-10844-91-01 Sega ROM board ID# 834-10845-91-01 -Driver/Control BD ID# 837-10859 with EPR-16891 (not dumped) +Driver/Control BD ID# 837-10859 with EPR-16891 837-8679 MODEL-1 SOUND BD + 837-8680 SOUND BD OPTION daughterboard with ID# 837-10858 838-10141-04 Sound AMP board */ @@ -1514,7 +1513,7 @@ ROM_START( wingwaru ) ROM_LOAD32_WORD( "mpr-16749.32", 0xc00000, 0x200000, CRC(0e36dc1a) SHA1(4939177a6ac51ca57d0acd118ff14af4f4e438bb) ) ROM_LOAD32_WORD( "mpr-16750.33", 0xc00002, 0x200000, CRC(e4f0b98d) SHA1(e69de2e5ccea2834fb8326bdd61fc6b517bc60b7) ) - ROM_REGION32_LE( 0x200000, "tgp_data", 0 ) /* TGP data roms */ + ROM_REGION32_LE( 0x200000, "copro_data", 0 ) /* TGP data roms */ ROM_LOAD32_BYTE( "mpr-16741.39", 0x000000, 0x80000, CRC(84b2ffd8) SHA1(0eba3855d20b88567c6fa08046e12429664d87cb) ) ROM_LOAD32_BYTE( "mpr-16742.40", 0x000001, 0x80000, CRC(e9cc12bb) SHA1(40c83c968be3b11fad193a00e7b760f074450683) ) ROM_LOAD32_BYTE( "mpr-16739.41", 0x000002, 0x80000, CRC(6c73e98f) SHA1(7b31e62922ab6d0df97c3ecc52b78e6d086c8635) ) @@ -1566,7 +1565,7 @@ ROM_START( wingwarj ) ROM_LOAD32_WORD( "mpr-16749.32", 0xc00000, 0x200000, CRC(0e36dc1a) SHA1(4939177a6ac51ca57d0acd118ff14af4f4e438bb) ) ROM_LOAD32_WORD( "mpr-16750.33", 0xc00002, 0x200000, CRC(e4f0b98d) SHA1(e69de2e5ccea2834fb8326bdd61fc6b517bc60b7) ) - ROM_REGION32_LE( 0x200000, "tgp_data", 0 ) /* TGP data roms */ + ROM_REGION32_LE( 0x200000, "copro_data", 0 ) /* TGP data roms */ ROM_LOAD32_BYTE( "mpr-16741.39", 0x000000, 0x80000, CRC(84b2ffd8) SHA1(0eba3855d20b88567c6fa08046e12429664d87cb) ) ROM_LOAD32_BYTE( "mpr-16742.40", 0x000001, 0x80000, CRC(e9cc12bb) SHA1(40c83c968be3b11fad193a00e7b760f074450683) ) ROM_LOAD32_BYTE( "mpr-16739.41", 0x000002, 0x80000, CRC(6c73e98f) SHA1(7b31e62922ab6d0df97c3ecc52b78e6d086c8635) ) @@ -1620,7 +1619,7 @@ ROM_START( wingwar360 ) ROM_LOAD32_WORD( "mpr-16749.32", 0xc00000, 0x200000, CRC(0e36dc1a) SHA1(4939177a6ac51ca57d0acd118ff14af4f4e438bb) ) ROM_LOAD32_WORD( "mpr-16750.33", 0xc00002, 0x200000, CRC(e4f0b98d) SHA1(e69de2e5ccea2834fb8326bdd61fc6b517bc60b7) ) - ROM_REGION32_LE( 0x200000, "tgp_data", 0 ) /* TGP data roms */ + ROM_REGION32_LE( 0x200000, "copro_data", 0 ) /* TGP data roms */ ROM_LOAD32_BYTE( "mpr-16741.39", 0x000000, 0x80000, CRC(84b2ffd8) SHA1(0eba3855d20b88567c6fa08046e12429664d87cb) ) ROM_LOAD32_BYTE( "mpr-16742.40", 0x000001, 0x80000, CRC(e9cc12bb) SHA1(40c83c968be3b11fad193a00e7b760f074450683) ) ROM_LOAD32_BYTE( "mpr-16739.41", 0x000002, 0x80000, CRC(6c73e98f) SHA1(7b31e62922ab6d0df97c3ecc52b78e6d086c8635) ) @@ -1668,7 +1667,7 @@ ROM_START( netmerc ) ROM_LOAD32_WORD( "mpr-18132.ic30", 0x800000, 0x200000, CRC(a17e3ac2) SHA1(19827c06ebc3e9de63668ef07675224e169d853e) ) ROM_LOAD32_WORD( "mpr-18133.ic31", 0x800002, 0x200000, CRC(f56354dd) SHA1(2ef1fe8b4995a67b70b565adf8f0ea0ad6e10094) ) - ROM_REGION32_LE( 0x200000, "tgp_data", ROMREGION_ERASE00 ) // IC39-IC42 unpopulated + ROM_REGION32_LE( 0x200000, "copro_data", ROMREGION_ERASE00 ) // IC39-IC42 unpopulated ROM_REGION( 0x8000, "polhemus", 0 ) /* POLHEMUS board */ ROM_LOAD16_BYTE( "u1", 0x0000, 0x4000, CRC(7073a312) SHA1(d2582f9520b8c8c051708dd372633112af59206e) ) @@ -1694,9 +1693,6 @@ MACHINE_CONFIG_START(model1_state::model1) MCFG_DEVICE_ADDRESS_MAP(mb86233_device::AS_RF, copro_rf_map) #endif - MCFG_MACHINE_START_OVERRIDE(model1_state,model1) - MCFG_MACHINE_RESET_OVERRIDE(model1_state,model1) - model1io_device &ioboard(SEGA_MODEL1IO(config, "ioboard", 0)); ioboard.read_callback().set(m_dpram, FUNC(mb8421_device::left_r)); ioboard.write_callback().set(m_dpram, FUNC(mb8421_device::left_w)); @@ -1717,8 +1713,6 @@ MACHINE_CONFIG_START(model1_state::model1) MCFG_PALETTE_ADD("palette", 8192) MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR) - MCFG_VIDEO_START_OVERRIDE(model1_state,model1) - SEGAM1AUDIO(config, m_m1audio, 0); m_m1audio->rxd_handler().set(m_m1uart, FUNC(i8251_device::write_rxd)); diff --git a/src/mame/drivers/model2.cpp b/src/mame/drivers/model2.cpp index aa84d4c004a..e3487f79106 100644 --- a/src/mame/drivers/model2.cpp +++ b/src/mame/drivers/model2.cpp @@ -990,9 +990,9 @@ READ32_MEMBER(model2_state::model2_serial_r) { u32 result = 0; if (ACCESSING_BITS_0_7 && (offset == 0)) - result |= m_uart->data_r(space, 0); + result |= m_uart->data_r(); if (ACCESSING_BITS_16_23 && (offset == 0)) - result |= m_uart->status_r(space, 0) << 16; + result |= m_uart->status_r() << 16; return result; } @@ -1004,7 +1004,7 @@ WRITE32_MEMBER(model2_state::model2_serial_w) { if (ACCESSING_BITS_0_7 && (offset == 0)) { - m_uart->data_w(space, 0, data & 0xff); + m_uart->data_w(data & 0xff); if (m_scsp.found()) { @@ -1017,7 +1017,7 @@ WRITE32_MEMBER(model2_state::model2_serial_w) } if (ACCESSING_BITS_16_23 && (offset == 0)) { - m_uart->control_w(space, 0, (data >> 16) & 0xff); + m_uart->control_w((data >> 16) & 0xff); } } diff --git a/src/mame/drivers/model3.cpp b/src/mame/drivers/model3.cpp index 8e31ee66491..e4aeb0cae7d 100644 --- a/src/mame/drivers/model3.cpp +++ b/src/mame/drivers/model3.cpp @@ -1729,7 +1729,7 @@ READ8_MEMBER(model3_state::model3_sound_r) case 0: { if (m_uart.found()) - return m_uart->data_r(space, 0); + return m_uart->data_r(); break; } @@ -1737,7 +1737,7 @@ READ8_MEMBER(model3_state::model3_sound_r) case 4: { if (m_uart.found()) - return m_uart->status_r(space, 0); + return m_uart->status_r(); uint8_t res = 0; res |= 1; @@ -1757,7 +1757,7 @@ WRITE8_MEMBER(model3_state::model3_sound_w) set_irq_line(0x40, CLEAR_LINE); if (m_uart.found()) - m_uart->data_w(space, 0, data); + m_uart->data_w(data); // send to the sound board m_scsp1->midi_in(data); @@ -1771,7 +1771,7 @@ WRITE8_MEMBER(model3_state::model3_sound_w) case 4: if (m_uart.found()) - m_uart->control_w(space, 0, data); + m_uart->control_w(data); if (data == 0x27) { diff --git a/src/mame/drivers/ms6102.cpp b/src/mame/drivers/ms6102.cpp index 5ac1f1c6778..622a52318f1 100644 --- a/src/mame/drivers/ms6102.cpp +++ b/src/mame/drivers/ms6102.cpp @@ -135,8 +135,7 @@ void ms6102_state::ms6102_mem(address_map &map) void ms6102_state::ms6102_io(address_map &map) { map.unmap_value_high(); - map(0x00, 0x00).rw(m_i8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x01, 0x01).rw(m_i8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x00, 0x01).rw(m_i8251, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x10, 0x18).rw(m_dma8257, FUNC(i8257_device::read), FUNC(i8257_device::write)); map(0x20, 0x23).rw("pit8253", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x30, 0x30).mirror(0x0f).rw("589wa1", FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit)); diff --git a/src/mame/drivers/multi8.cpp b/src/mame/drivers/multi8.cpp index 466d08e9f04..84bcf4220a2 100644 --- a/src/mame/drivers/multi8.cpp +++ b/src/mame/drivers/multi8.cpp @@ -310,8 +310,7 @@ void multi8_state::multi8_io(address_map &map) map(0x1a, 0x1a).r(FUNC(multi8_state::ay8912_1_r)); map(0x1c, 0x1c).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)); map(0x1d, 0x1d).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); - map(0x20, 0x20).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x21, 0x21).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); //cmt + map(0x20, 0x21).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); //cmt map(0x24, 0x27).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); //pit map(0x28, 0x2b).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x2c, 0x2d).rw("pic", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); //i8259 diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp index c5566895f14..6933db3581c 100644 --- a/src/mame/drivers/namcos2.cpp +++ b/src/mame/drivers/namcos2.cpp @@ -3804,24 +3804,24 @@ ROM_START( fourtrax ) ROM_LOAD( "fx_obj-9.7c", 0x140000, 0x040000, CRC(90f0735b) SHA1(2adbe72c6547075c0cc0386789cc1b8c1a0bc84f) ) ROM_LOAD( "fx_obj-12.8a", 0x180000, 0x040000, CRC(f5e23b78) SHA1(99896bd7c6663e3f57cb5d206964b81b5d64c8b6) ) ROM_LOAD( "fx_obj-13.7a", 0x1c0000, 0x040000, CRC(04a25007) SHA1(0c33450b0d6907754dbf1914849d1630baa824bd) ) - ROM_LOAD( "fx_obj2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) ) + ROM_LOAD( "fx_obj-2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) ) ROM_LOAD( "fx_obj-3.1c", 0x240000, 0x040000, CRC(b7e5d17d) SHA1(3d8ea7cbf33b595ddf739024e8d0fccd5f9e073b) ) - ROM_LOAD( "fx_obj6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) ) - ROM_LOAD( "fx_obj7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) ) - ROM_LOAD( "fx_obj10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) ) + ROM_LOAD( "fx_obj-6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) ) + ROM_LOAD( "fx_obj-7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) ) + ROM_LOAD( "fx_obj-10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) ) ROM_LOAD( "fx_obj-11.5c", 0x340000, 0x040000, CRC(514b3fe5) SHA1(19562ba2ac04a16d335bdc81b34d929f7ff9161c) ) ROM_LOAD( "fx_obj-14.6a", 0x380000, 0x040000, CRC(c1658c77) SHA1(ec689d0e5cf95085c193aa8949c6ec6e7243338b) ) - ROM_LOAD( "fx_obj15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) ) + ROM_LOAD( "fx_obj-15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) ) ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles */ - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) ) - NAMCOS2_GFXROM_LOAD_128K( "fx2_ch2.11r", 0x100000, CRC(fdf1e86b) SHA1(91a61c10a9e92f8bbc26ffc9cb72deb31378a843) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-6.9r", 0x300000, CRC(c3dba42e) SHA1(2b5a8fabec11ccd44156ecfccf86fc713845d262) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-7.9s", 0x380000, CRC(c009f3ae) SHA1(394beed29bda97f4f5ba532bc0bd22177154746b) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) ) + NAMCOS2_GFXROM_LOAD_128K( "fx2_chr-2.11r", 0x100000, CRC(fdf1e86b) SHA1(91a61c10a9e92f8bbc26ffc9cb72deb31378a843) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-6.9r", 0x300000, CRC(c3dba42e) SHA1(2b5a8fabec11ccd44156ecfccf86fc713845d262) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-7.9s", 0x380000, CRC(c009f3ae) SHA1(394beed29bda97f4f5ba532bc0bd22177154746b) ) ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASEFF ) /* ROZ Tiles */ /* No ROZ files in zip */ @@ -3866,19 +3866,19 @@ ROM_START( fourtraxj ) ROM_LOAD( "fx_obj-9.7c", 0x140000, 0x040000, CRC(90f0735b) SHA1(2adbe72c6547075c0cc0386789cc1b8c1a0bc84f) ) ROM_LOAD( "fx_obj-12.8a", 0x180000, 0x040000, CRC(f5e23b78) SHA1(99896bd7c6663e3f57cb5d206964b81b5d64c8b6) ) ROM_LOAD( "fx_obj-13.7a", 0x1c0000, 0x040000, CRC(04a25007) SHA1(0c33450b0d6907754dbf1914849d1630baa824bd) ) - ROM_LOAD( "fx_obj2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) ) + ROM_LOAD( "fx_obj-2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) ) ROM_LOAD( "fx_obj-3.1c", 0x240000, 0x040000, CRC(b7e5d17d) SHA1(3d8ea7cbf33b595ddf739024e8d0fccd5f9e073b) ) - ROM_LOAD( "fx_obj6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) ) - ROM_LOAD( "fx_obj7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) ) - ROM_LOAD( "fx_obj10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) ) + ROM_LOAD( "fx_obj-6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) ) + ROM_LOAD( "fx_obj-7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) ) + ROM_LOAD( "fx_obj-10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) ) ROM_LOAD( "fx_obj-11.5c", 0x340000, 0x040000, CRC(514b3fe5) SHA1(19562ba2ac04a16d335bdc81b34d929f7ff9161c) ) ROM_LOAD( "fx_obj-14.6a", 0x380000, 0x040000, CRC(c1658c77) SHA1(ec689d0e5cf95085c193aa8949c6ec6e7243338b) ) - ROM_LOAD( "fx_obj15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) ) + ROM_LOAD( "fx_obj-15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) ) ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles */ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) ) NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) ) - NAMCOS2_GFXROM_LOAD_128K( "fx2_ch2.11r", 0x100000, CRC(fdf1e86b) SHA1(91a61c10a9e92f8bbc26ffc9cb72deb31378a843) ) // should this be the same, fx2 is the world set label, needs checking + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-2.11r", 0x100000, CRC(179e4ec6) SHA1(2936ef847c5a9e527f7198f65a21eee7ac36891c) ) NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) ) NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) ) NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) ) @@ -3917,8 +3917,8 @@ ROM_END ROM_START( fourtraxa ) ROM_REGION( 0x040000, "maincpu", 0 ) /* Master CPU */ - ROM_LOAD16_BYTE( "fx4_mp0a.11d", 0x000000, 0x020000, CRC(f147cd6b) SHA1(7cdadd68d55dd8fa9b19cbee1434d9266ae1f4b9) ) // == fx2_mp0.11d - ROM_LOAD16_BYTE( "fx4_mp1a.13d", 0x000001, 0x020000, CRC(d1138c85) SHA1(32bf68ae36f72b84f3c3df28425147b6aaac1edf) ) + ROM_LOAD16_BYTE( "fx4_mpr-0a.11d", 0x000000, 0x020000, CRC(f147cd6b) SHA1(7cdadd68d55dd8fa9b19cbee1434d9266ae1f4b9) ) // == fx2_mp0.11d + ROM_LOAD16_BYTE( "fx4_mpr-1a.13d", 0x000001, 0x020000, CRC(d1138c85) SHA1(32bf68ae36f72b84f3c3df28425147b6aaac1edf) ) ROM_REGION( 0x040000, "slave", 0 ) /* Slave CPU */ ROM_LOAD16_BYTE( "fx1_sp0.11k", 0x000000, 0x020000, CRC(48548e78) SHA1(b3a9de8682fe63c1c3ecab3e3f9380a884efd4af) ) // same content as fx2 set, different label @@ -3939,24 +3939,24 @@ ROM_START( fourtraxa ) ROM_LOAD( "fx_obj-9.7c", 0x140000, 0x040000, CRC(90f0735b) SHA1(2adbe72c6547075c0cc0386789cc1b8c1a0bc84f) ) ROM_LOAD( "fx_obj-12.8a", 0x180000, 0x040000, CRC(f5e23b78) SHA1(99896bd7c6663e3f57cb5d206964b81b5d64c8b6) ) ROM_LOAD( "fx_obj-13.7a", 0x1c0000, 0x040000, CRC(04a25007) SHA1(0c33450b0d6907754dbf1914849d1630baa824bd) ) - ROM_LOAD( "fx_obj2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) ) + ROM_LOAD( "fx_obj-2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) ) ROM_LOAD( "fx_obj-3.1c", 0x240000, 0x040000, CRC(b7e5d17d) SHA1(3d8ea7cbf33b595ddf739024e8d0fccd5f9e073b) ) - ROM_LOAD( "fx_obj6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) ) - ROM_LOAD( "fx_obj7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) ) - ROM_LOAD( "fx_obj10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) ) + ROM_LOAD( "fx_obj-6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) ) + ROM_LOAD( "fx_obj-7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) ) + ROM_LOAD( "fx_obj-10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) ) ROM_LOAD( "fx_obj-11.5c", 0x340000, 0x040000, CRC(514b3fe5) SHA1(19562ba2ac04a16d335bdc81b34d929f7ff9161c) ) ROM_LOAD( "fx_obj-14.6a", 0x380000, 0x040000, CRC(c1658c77) SHA1(ec689d0e5cf95085c193aa8949c6ec6e7243338b) ) - ROM_LOAD( "fx_obj15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) ) + ROM_LOAD( "fx_obj-15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) ) ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles */ - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) ) - NAMCOS2_GFXROM_LOAD_128K( "fx4_ch-2a.11r",0x100000, CRC(a5d1ab10) SHA1(8624ef0911c57155b46e184d10cb122d4a41a2de) ) // unique to this set, mask ROM intentionally replaced - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-6.9r", 0x300000, CRC(c3dba42e) SHA1(2b5a8fabec11ccd44156ecfccf86fc713845d262) ) - NAMCOS2_GFXROM_LOAD_128K( "fx_chr-7.9s", 0x380000, CRC(c009f3ae) SHA1(394beed29bda97f4f5ba532bc0bd22177154746b) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) ) + NAMCOS2_GFXROM_LOAD_128K( "fx4_chr-2a.11r", 0x100000, CRC(a5d1ab10) SHA1(8624ef0911c57155b46e184d10cb122d4a41a2de) ) // unique to this set, mask ROM intentionally replaced + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-6.9r", 0x300000, CRC(c3dba42e) SHA1(2b5a8fabec11ccd44156ecfccf86fc713845d262) ) + NAMCOS2_GFXROM_LOAD_128K( "fx_chr-7.9s", 0x380000, CRC(c009f3ae) SHA1(394beed29bda97f4f5ba532bc0bd22177154746b) ) ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASEFF ) /* ROZ Tiles */ /* No ROZ files in zip */ diff --git a/src/mame/drivers/nc.cpp b/src/mame/drivers/nc.cpp index 9591e98f3a5..6b622164f45 100644 --- a/src/mame/drivers/nc.cpp +++ b/src/mame/drivers/nc.cpp @@ -855,8 +855,7 @@ void nc100_state::nc100_io(address_map &map) map(0x91, 0x9f).r(FUNC(nc100_state::nc_irq_status_r)); map(0xa0, 0xaf).r(FUNC(nc100_state::nc100_card_battery_status_r)); map(0xb0, 0xb9).r(FUNC(nc100_state::nc_key_data_in_r)); - map(0xc0, 0xc0).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xc1, 0xc1).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xc0, 0xc1).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xd0, 0xdf).rw("rtc", FUNC(tc8521_device::read), FUNC(tc8521_device::write)); } @@ -1259,8 +1258,7 @@ void nc200_state::nc200_io(address_map &map) map(0x90, 0x90).rw(FUNC(nc200_state::nc_irq_status_r), FUNC(nc200_state::nc200_irq_status_w)); map(0xa0, 0xa0).r(FUNC(nc200_state::nc200_card_battery_status_r)); map(0xb0, 0xb9).r(FUNC(nc200_state::nc_key_data_in_r)); - map(0xc0, 0xc0).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xc1, 0xc1).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xc0, 0xc1).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xd0, 0xd1).rw("mc", FUNC(mc146818_device::read), FUNC(mc146818_device::write)); map(0xe0, 0xe1).m("upd765", FUNC(upd765a_device::map)); } diff --git a/src/mame/drivers/neogeo.cpp b/src/mame/drivers/neogeo.cpp index bec0233cf24..d8afdcc4310 100644 --- a/src/mame/drivers/neogeo.cpp +++ b/src/mame/drivers/neogeo.cpp @@ -1351,38 +1351,22 @@ void neogeo_base_state::init_audio() void neogeo_base_state::init_ym() { - uint8_t *ROM; - uint32_t len; - // Resetting a sound device causes the core to update() it and generate samples if it's not up to date. - // Thus we preemptively reset it here while the old pointers are still valid so it's up to date and - // doesn't generate samples below when we reset it for the new pointers. m_ym->reset(); - // all these region_free / region_alloc machinery is needed because current YM emulation does not allow - // to pass a ROM pointer different from a "ymsnd" / "ymsnd.deltat" region, and therefore we need to copy - // the ROM(s) from the cart to the corresponding region(s) with appropriate names... + address_space &adpcm_a_space = m_ym->space(0); + adpcm_a_space.unmap_readwrite(0x000000, 0xffffff); + if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ym_size()) - { - ROM = m_slots[m_curr_slot]->get_ym_base(); - len = m_slots[m_curr_slot]->get_ym_size(); - if (memregion(":ymsnd")) - machine().memory().region_free(":ymsnd"); - machine().memory().region_alloc(":ymsnd", len, 1, ENDIANNESS_LITTLE); - memcpy(memregion(":ymsnd")->base(), ROM, len); - } + adpcm_a_space.install_rom(0, m_slots[m_curr_slot]->get_ym_size() - 1, m_slots[m_curr_slot]->get_ym_base()); - if (memregion(":ymsnd.deltat")) - machine().memory().region_free(":ymsnd.deltat"); - if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ymdelta_size()) - { - ROM = m_slots[m_curr_slot]->get_ymdelta_base(); - len = m_slots[m_curr_slot]->get_ymdelta_size(); - machine().memory().region_alloc(":ymsnd.deltat", len, 1, ENDIANNESS_LITTLE); - memcpy(memregion(":ymsnd.deltat")->base(), ROM, len); - } + address_space &adpcm_b_space = m_ym->space(1); + adpcm_b_space.unmap_readwrite(0x000000, 0xffffff); - m_ym->reset(); // reset it again to get the new pointers + if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ymdelta_size()) + adpcm_b_space.install_rom(0, m_slots[m_curr_slot]->get_ymdelta_size() - 1, m_slots[m_curr_slot]->get_ymdelta_base()); + else if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ym_size()) + adpcm_b_space.install_rom(0, m_slots[m_curr_slot]->get_ym_size() - 1, m_slots[m_curr_slot]->get_ym_base()); } void neogeo_base_state::init_sprites() @@ -1980,11 +1964,10 @@ MACHINE_CONFIG_START(neogeo_base_state::neogeo_stereo) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - MCFG_DEVICE_MODIFY("ymsnd") - MCFG_SOUND_ROUTE(0, "lspeaker", 0.28) - MCFG_SOUND_ROUTE(0, "rspeaker", 0.28) - MCFG_SOUND_ROUTE(1, "lspeaker", 0.98) - MCFG_SOUND_ROUTE(2, "rspeaker", 0.98) + m_ym->add_route(0, "lspeaker", 0.28); + m_ym->add_route(0, "rspeaker", 0.28); + m_ym->add_route(1, "lspeaker", 0.98); + m_ym->add_route(2, "rspeaker", 0.98); MACHINE_CONFIG_END @@ -2008,10 +1991,9 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(ngarcade_base_state::neogeo_mono) SPEAKER(config, "speaker").front_center(); - MCFG_DEVICE_MODIFY("ymsnd") - MCFG_SOUND_ROUTE(0, "speaker", 0.28) - MCFG_SOUND_ROUTE(1, "speaker", 0.49) - MCFG_SOUND_ROUTE(2, "speaker", 0.49) + m_ym->add_route(0, "speaker", 0.28); + m_ym->add_route(1, "speaker", 0.49); + m_ym->add_route(2, "speaker", 0.49); MACHINE_CONFIG_END @@ -2314,8 +2296,7 @@ MACHINE_CONFIG_END ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \ ROM_REGION( 0x20000, "cslot1:audiocpu", 0 ) \ ROM_LOAD( name, 0x00000, 0x10000, hash ) \ - ROM_RELOAD( 0x10000, 0x10000 ) \ - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) + ROM_RELOAD( 0x10000, 0x10000 ) #define NEO_BIOS_AUDIO_128K(name, hash) \ NEOGEO_BIOS \ @@ -2323,8 +2304,7 @@ MACHINE_CONFIG_END ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \ ROM_REGION( 0x30000, "cslot1:audiocpu", 0 ) \ ROM_LOAD( name, 0x00000, 0x20000, hash ) \ - ROM_RELOAD( 0x10000, 0x20000 ) \ - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) + ROM_RELOAD( 0x10000, 0x20000 ) #define NEO_BIOS_AUDIO_256K(name, hash) \ NEOGEO_BIOS \ @@ -2332,8 +2312,7 @@ MACHINE_CONFIG_END ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \ ROM_REGION( 0x50000, "cslot1:audiocpu", 0 ) \ ROM_LOAD( name, 0x00000, 0x40000, hash ) \ - ROM_RELOAD( 0x10000, 0x40000 ) \ - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) + ROM_RELOAD( 0x10000, 0x40000 ) #define NEO_BIOS_AUDIO_512K(name, hash) \ NEOGEO_BIOS \ @@ -2341,9 +2320,7 @@ MACHINE_CONFIG_END ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \ ROM_REGION( 0x90000, "cslot1:audiocpu", 0 ) \ ROM_LOAD( name, 0x00000, 0x80000, hash ) \ - ROM_RELOAD( 0x10000, 0x80000 ) \ - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) - + ROM_RELOAD( 0x10000, 0x80000 ) #define NEO_BIOS_AUDIO_ENCRYPTED_128K(name, hash) \ NEOGEO_BIOS \ @@ -2351,24 +2328,23 @@ MACHINE_CONFIG_END ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \ ROM_REGION( 0x90000, "cslot1:audiocpu", ROMREGION_ERASEFF ) \ ROM_REGION( 0x80000, "cslot1:audiocrypt", 0 ) \ - ROM_LOAD( name, 0x00000, 0x20000, hash ) \ - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) + ROM_LOAD( name, 0x00000, 0x20000, hash ) + #define NEO_BIOS_AUDIO_ENCRYPTED_256K(name, hash) \ NEOGEO_BIOS \ ROM_REGION( 0x20000, "audiobios", 0 ) \ ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \ ROM_REGION( 0x90000, "cslot1:audiocpu", ROMREGION_ERASEFF ) \ ROM_REGION( 0x80000, "cslot1:audiocrypt", 0 ) \ - ROM_LOAD( name, 0x00000, 0x40000, hash ) \ - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) + ROM_LOAD( name, 0x00000, 0x40000, hash ) + #define NEO_BIOS_AUDIO_ENCRYPTED_512K(name, hash) \ NEOGEO_BIOS \ ROM_REGION( 0x20000, "audiobios", 0 ) \ ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \ ROM_REGION( 0x90000, "cslot1:audiocpu", ROMREGION_ERASEFF ) \ ROM_REGION( 0x80000, "cslot1:audiocrypt", 0 ) \ - ROM_LOAD( name, 0x00000, 0x80000, hash ) \ - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) + ROM_LOAD( name, 0x00000, 0x80000, hash ) @@ -2411,8 +2387,6 @@ ROM_START( neogeo ) ROM_REGION( 0x20000, "fixedbios", 0 ) ROM_LOAD( "sfix.sfix", 0x000000, 0x20000, CRC(c2ea0cfd) SHA1(fd4a618cdcdbf849374f0a50dd8efe9dbab706c3) ) - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) - ROM_REGION( 0x100000, "sprites", ROMREGION_ERASEFF ) ROM_END @@ -2441,10 +2415,6 @@ ROM_START( aes ) ROM_REGION( 0x20000, "fixed", ROMREGION_ERASEFF ) - ROM_REGION( 0x1000000, "ymsnd", ROMREGION_ERASEFF ) - - ROM_REGION( 0x1000000, "ymsnd.deltat", ROMREGION_ERASEFF ) - ROM_REGION( 0x900000, "sprites", ROMREGION_ERASEFF ) ROM_END @@ -6473,7 +6443,6 @@ ROM_START( dragonsh ) ROM_REGION( 0x30000, "cslot1:audiocpu", ROMREGION_ERASEFF ) // not present - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) ROM_REGION( 0x200000, "cslot1:ymsnd", ROMREGION_ERASE00 ) ROM_LOAD( "sram.v1", 0x000000, 0x200000, NO_DUMP ) // was a dead AXS2000PC 2MB sram card, battery dead, data lost. @@ -7099,7 +7068,6 @@ ROM_START( kizuna4p ) /* same cartridge as kizuna - 4-player mode is enabled by ROM_LOAD16_WORD_SWAP_BIOS( 0, "sp-45.sp1",0x00000, 0x080000, CRC(03cc9f6a) SHA1(cdf1f49e3ff2bac528c21ed28449cf35b7957dc1) ) ROM_SYSTEM_BIOS( 1, "japan", "Japan MVS (J3)" ) ROM_LOAD16_WORD_SWAP_BIOS( 1, "japan-j3.bin",0x00000, 0x020000, CRC(dff6d41f) SHA1(e92910e20092577a4523a6b39d578a71d4de7085) ) - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) ROM_REGION( 0x30000, "cslot1:audiocpu", 0 ) ROM_LOAD( "216-m1.m1", 0x00000, 0x20000, CRC(1b096820) SHA1(72852e78c620038f8dafde5e54e02e418c31be9c) ) /* mask rom TC531001 */ @@ -7796,7 +7764,6 @@ ROM_START( irrmaze ) /* MVS ONLY RELEASE */ ROM_REGION16_BE( 0x20000, "mainbios", 0 ) /* special BIOS with trackball support, we only have one Irritating Maze bios and thats asia */ ROM_LOAD16_WORD_SWAP("236-bios.sp1", 0x00000, 0x020000, CRC(853e6b96) SHA1(de369cb4a7df147b55168fa7aaf0b98c753b735e) ) - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) ROM_REGION( 0x30000, "cslot1:audiocpu", 0 ) ROM_LOAD( "236-m1.m1", 0x00000, 0x20000, CRC(880a1abd) SHA1(905afa157aba700e798243b842792e50729b19a0) ) /* TC531001 */ @@ -10944,7 +10911,6 @@ ROM_START( svcboot ) ROM_REGION( 0x20000, "audiobios", 0 ) ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) ROM_REGION( 0x50000, "cslot1:audiocpu", 0 ) ROM_LOAD( "svc-m1.bin", 0x20000, 0x10000, CRC(804328c3) SHA1(f931636c563b0789d4812033a77b47bf663db43f) ) @@ -10982,7 +10948,6 @@ ROM_START( svcplus ) ROM_REGION( 0x20000, "audiobios", 0 ) ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) ROM_REGION( 0x50000, "cslot1:audiocpu", 0 ) ROM_LOAD( "svc-m1.bin", 0x20000, 0x10000, CRC(804328c3) SHA1(f931636c563b0789d4812033a77b47bf663db43f) ) @@ -11021,7 +10986,6 @@ ROM_START( svcplusa ) ROM_REGION( 0x20000, "audiobios", 0 ) ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) ROM_REGION( 0x50000, "cslot1:audiocpu", 0 ) ROM_LOAD( "svc-m1.bin", 0x20000, 0x10000, CRC(804328c3) SHA1(f931636c563b0789d4812033a77b47bf663db43f) ) @@ -11058,7 +11022,6 @@ ROM_START( svcsplus ) ROM_REGION( 0x20000, "audiobios", 0 ) ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) - ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF ) ROM_REGION( 0x50000, "cslot1:audiocpu", 0 ) ROM_LOAD( "svc-m1.bin", 0x20000, 0x10000, CRC(804328c3) SHA1(f931636c563b0789d4812033a77b47bf663db43f) ) diff --git a/src/mame/drivers/nforcepc.cpp b/src/mame/drivers/nforcepc.cpp index e8b26ad1b02..2fd47bff6ea 100644 --- a/src/mame/drivers/nforcepc.cpp +++ b/src/mame/drivers/nforcepc.cpp @@ -24,6 +24,83 @@ #include "cpu/i386/i386.h" #include "machine/pci.h" #include "machine/pci-ide.h" +#include "includes/nforcepc.h" + +/* + Pci devices +*/ + +DEFINE_DEVICE_TYPE(CRUSH11, crush11_host_device, "crush11", "NVIDIA Corporation nForce CPU bridge") + +void crush11_host_device::config_map(address_map &map) +{ + pci_host_device::config_map(map); + map(0x50, 0x50).rw(FUNC(crush11_host_device::test_r), FUNC(crush11_host_device::test_w)); +} + +crush11_host_device::crush11_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : pci_host_device(mconfig, CRUSH11, tag, owner, clock) + , cpu(*this, finder_base::DUMMY_TAG) +{ +} + +void crush11_host_device::set_ram_size(int ram_size) +{ + ddr_ram_size = ram_size; +} + +void crush11_host_device::device_start() +{ + pci_host_device::device_start(); + memory_space = &cpu->space(AS_PROGRAM); + io_space = &cpu->space(AS_IO); + + memory_window_start = 0; + memory_window_end = 0xffffffff; + memory_offset = 0; + io_window_start = 0; + io_window_end = 0xffff; + io_offset = 0; + status = 0x0010; + + ram.resize(ddr_ram_size / 4); +} + +void crush11_host_device::reset_all_mappings() +{ + pci_host_device::reset_all_mappings(); +} + +void crush11_host_device::device_reset() +{ + pci_host_device::device_reset(); +} + +void crush11_host_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) +{ + io_space->install_device(0, 0xffff, *static_cast<pci_host_device *>(this), &pci_host_device::io_configuration_access_map); + + memory_space->install_ram(0x00000000, 0x0009ffff, &ram[0x00000000 / 4]); + memory_space->install_ram(0x00100000, ddr_ram_size - 1, &ram[0x00100000 / 4]); + uint32_t mask = m_region->bytes() - 1; + memory_space->install_rom(0x000c0000, 0x000fffff, m_region->base() + (0x000c0000 & mask)); + memory_space->install_rom(0xfffc0000, 0xffffffff, m_region->base() + (0x000c0000 & mask)); +} + +READ8_MEMBER(crush11_host_device::test_r) +{ + return 0; +} + +WRITE8_MEMBER(crush11_host_device::test_w) +{ + logerror("test = %02x\n", data); +} + +/* + Machine state +*/ class nforcepc_state : public driver_device { @@ -79,8 +156,6 @@ WRITE8_MEMBER(nforcepc_state::boot_state_award_w) void nforcepc_state::nforce_map(address_map &map) { map.unmap_value_high(); - map(0x000c0000, 0x000fffff).rom().region("bios", 0); - map(0xfffc0000, 0xffffffff).rom().region("bios", 0); } void nforcepc_state::nforce_map_io(address_map &map) @@ -88,16 +163,19 @@ void nforcepc_state::nforce_map_io(address_map &map) map.unmap_value_high(); } +/* + Machine configuration +*/ + MACHINE_CONFIG_START(nforcepc_state::nforcepc) MCFG_DEVICE_ADD("maincpu", ATHLONXP, 90000000) MCFG_DEVICE_PROGRAM_MAP(nforce_map) MCFG_DEVICE_IO_MAP(nforce_map_io) -/* MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pci:07.0:pic8259_master", pic8259_device, inta_cb) + MCFG_DEVICE_ADD(":pci", PCI_ROOT, 0) + MCFG_DEVICE_ADD(":pci:00.0", CRUSH11, 0, "maincpu", 2 * 1024 * 1024) + /* MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pci:07.0:pic8259_master", pic8259_device, inta_cb) MCFG_I386_SMIACT(WRITELINE("pci:00.0", i82439hx_host_device, smi_act_w)) - MCFG_DEVICE_ADD( ":pci", PCI_ROOT, 0) - MCFG_DEVICE_ADD( ":pci:00.0", I82439HX, 0, "maincpu", 256*1024*1024) - i82371sb_isa_device &isa(I82371SB_ISA(config, ":pci:07.0", 0)); isa.boot_state_hook().set(FUNC(nforcepc_state::boot_state_phoenix_ver40_rev6_w)); isa.smi().set_inputline(":maincpu", INPUT_LINE_SMI); @@ -108,7 +186,7 @@ MACHINE_CONFIG_START(nforcepc_state::nforcepc) MACHINE_CONFIG_END ROM_START(nforcepc) - ROM_REGION32_LE(0x40000, "bios", 0) /* PC bios */ + ROM_REGION32_LE(0x40000, ":pci:00.0", 0) /* PC bios */ ROM_SYSTEM_BIOS(0, "a7n266c", "a7n266c") // Motherboard dump. Chip: SST49LF020 Package: PLCC32 Label had 3 lines of text: "A7NC3" "1001.D" "GSQ98" ROMX_LOAD("a7n266c.bin", 0, 0x40000, CRC(F4F0E4FC), ROM_BIOS(0)) ROM_SYSTEM_BIOS(1, "a7n266c1001d", "a7n266c1001d") // bios version 1001.D dwonloaded from Asus website diff --git a/src/mame/drivers/ngen.cpp b/src/mame/drivers/ngen.cpp index 9d7e2e0bbda..3535c8d365e 100644 --- a/src/mame/drivers/ngen.cpp +++ b/src/mame/drivers/ngen.cpp @@ -346,12 +346,9 @@ WRITE16_MEMBER(ngen_state::peripheral_w) m_crtc->register_w(space,0,data & 0xff); break; case 0x146: - if(ACCESSING_BITS_0_7) - m_viduart->data_w(space,0,data & 0xff); - break; case 0x147: if(ACCESSING_BITS_0_7) - m_viduart->control_w(space,0,data & 0xff); + m_viduart->write(offset & 1, data & 0xff); break; case 0x1a0: // serial? logerror("Serial(?) 0x1a0 write offset %04x data %04x mask %04x\n",offset,data,mem_mask); @@ -420,13 +417,10 @@ READ16_MEMBER(ngen_state::peripheral_r) ret = m_crtc->register_r(space,0); break; case 0x146: - if(ACCESSING_BITS_0_7) - ret = m_viduart->data_r(space,0); - break; case 0x147: // keyboard UART - // expects bit 0 to be set (UART transmit ready) + // status expects bit 0 to be set (UART transmit ready) if(ACCESSING_BITS_0_7) - ret = m_viduart->status_r(space,0); + ret = m_viduart->read(offset & 1); break; case 0x1a0: // I/O control register? ret = m_control; // end of DMA transfer? (maybe a per-channel EOP?) Bit 6 is set during a transfer? @@ -791,13 +785,10 @@ READ16_MEMBER( ngen_state::b38_keyboard_r ) switch(offset) { case 0: - if(ACCESSING_BITS_0_7) - ret = m_viduart->data_r(space,0); - break; case 1: // keyboard UART - // expects bit 0 to be set (UART transmit ready) + // status expects bit 0 to be set (UART transmit ready) if(ACCESSING_BITS_0_7) - ret = m_viduart->status_r(space,0); + ret = m_viduart->read(offset & 1); break; } return ret; @@ -808,12 +799,9 @@ WRITE16_MEMBER( ngen_state::b38_keyboard_w ) switch(offset) { case 0: - if(ACCESSING_BITS_0_7) - m_viduart->data_w(space,0,data & 0xff); - break; case 1: if(ACCESSING_BITS_0_7) - m_viduart->control_w(space,0,data & 0xff); + m_viduart->write(offset & 1, data & 0xff); break; } } @@ -829,7 +817,7 @@ READ16_MEMBER( ngen_state::b38_crtc_r ) break; case 1: if(ACCESSING_BITS_0_7) - ret = m_viduart->data_r(space,0); + ret = m_viduart->data_r(); break; } return ret; diff --git a/src/mame/drivers/octopus.cpp b/src/mame/drivers/octopus.cpp index 7f1a2da06a3..85b40554c79 100644 --- a/src/mame/drivers/octopus.cpp +++ b/src/mame/drivers/octopus.cpp @@ -305,8 +305,7 @@ void octopus_state::octopus_io(address_map &map) map(0x20, 0x20).portr("DSWA"); map(0x21, 0x2f).rw(FUNC(octopus_state::system_r), FUNC(octopus_state::system_w)); map(0x31, 0x33).rw(FUNC(octopus_state::bank_sel_r), FUNC(octopus_state::bank_sel_w)); - map(0x50, 0x50).rw(m_kb_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x51, 0x51).rw(m_kb_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x50, 0x51).rw(m_kb_uart, FUNC(i8251_device::read), FUNC(i8251_device::write)); // 0x70-73: HD controller map(0x80, 0x83).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0xa0, 0xa0).rw(m_serial, FUNC(z80sio_device::da_r), FUNC(z80sio_device::da_w)); diff --git a/src/mame/drivers/okean240.cpp b/src/mame/drivers/okean240.cpp index 7114a44014e..5bcc07378c7 100644 --- a/src/mame/drivers/okean240.cpp +++ b/src/mame/drivers/okean240.cpp @@ -255,8 +255,7 @@ void okean240_state::okean240a_io(address_map &map) map(0x60, 0x63).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x80, 0x81).rw("pic", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x80, 0x80).r(FUNC(okean240_state::okean240a_kbd_status_r)); - map(0xa0, 0xa0).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xa1, 0xa1).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xa0, 0xa1).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xc0, 0xc3).rw("ppic", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xe0, 0xe3).rw("ppie", FUNC(i8255_device::read), FUNC(i8255_device::write)); // AM_RANGE(0x00, 0x1f)=ppa00.data @@ -279,8 +278,7 @@ void okean240_state::okean240t_io(address_map &map) map(0x60, 0x63).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x80, 0x81).rw("pic", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x80, 0x80).r(FUNC(okean240_state::okean240_kbd_status_r)); - map(0xa0, 0xa0).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xa1, 0xa1).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xa0, 0xa1).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xc0, 0xc3).rw("ppic", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xe0, 0xe3).rw("ppie", FUNC(i8255_device::read), FUNC(i8255_device::write)); } diff --git a/src/mame/drivers/opwolf.cpp b/src/mame/drivers/opwolf.cpp index 9a97b534e9e..6c2e351021a 100644 --- a/src/mame/drivers/opwolf.cpp +++ b/src/mame/drivers/opwolf.cpp @@ -258,7 +258,10 @@ TODO There are a few unmapped writes for the sound Z80 in the log. -Unknown writes to the MSM5205 control addresses +Unknown writes to the MSM5205 control addresses (RUN/RES implementation is wrong) + +Sound volume filtering is imperfect. Notably the coin insert sound: +MSM1 rings it at volume 0xa8, MSM2 echos it at volume 0x84 but should be more muffled. Raine source has standard Asuka/Mofflot sprite/tile priority: 0x2000 in sprite_ctrl puts all sprites under top bg layer. But @@ -304,7 +307,9 @@ public: m_cchip_irq_clear(*this, "cchip_irq_clear"), m_pc080sn(*this, "pc080sn"), m_pc090oj(*this, "pc090oj"), - m_msm(*this, "msm%u", 0) + m_msm(*this, "msm%u", 0), + m_lspeaker(*this, "lspeaker"), + m_rspeaker(*this, "rspeaker") { } void opwolf(machine_config &config); @@ -371,6 +376,8 @@ private: required_device<pc080sn_device> m_pc080sn; required_device<pc090oj_device> m_pc090oj; required_device_array<msm5205_device, 2> m_msm; + required_device<speaker_device> m_lspeaker; + required_device<speaker_device> m_rspeaker; }; @@ -747,15 +754,15 @@ WRITE8_MEMBER(opwolf_state::sound_bankswitch_w) membank("z80bank")->set_entry(data & 0x03); } -//static uint8_t adpcm_d[0x08]; //0 - start ROM offset LSB //1 - start ROM offset MSB //2 - end ROM offset LSB //3 - end ROM offset MSB //start & end need to be multiplied by 16 to get a proper _byte_ address in adpcm ROM -//4 - always zero write (start trigger ?) -//5 - different values -//6 - different values +//4 - RUN, always zero write (start trigger ?) +//5 - VOL, sample volume +//6 - RES +//7 - N/C template<int N> WRITE_LINE_MEMBER(opwolf_state::msm5205_vck_w) @@ -794,6 +801,7 @@ WRITE8_MEMBER(opwolf_state::opwolf_adpcm_b_w) m_adpcm_pos[0] = start; m_adpcm_end[0] = end; m_msm[0]->reset_w(0); + m_msm[0]->set_output_gain(0, m_adpcm_b[5] / 255.0); //logerror("TRIGGER MSM1\n"); } @@ -816,6 +824,7 @@ WRITE8_MEMBER(opwolf_state::opwolf_adpcm_c_w) m_adpcm_pos[1] = start; m_adpcm_end[1] = end; m_msm[1]->reset_w(0); + m_msm[1]->set_output_gain(0, m_adpcm_c[5] / 255.0); //logerror("TRIGGER MSM2\n"); } @@ -824,12 +833,16 @@ WRITE8_MEMBER(opwolf_state::opwolf_adpcm_c_w) WRITE8_MEMBER(opwolf_state::opwolf_adpcm_d_w) { -// logerror("CPU #1 d00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); + // total volume (speaker 1) + for (int i = 0; i <= 2; i++) + m_lspeaker->set_input_gain(i, data / 255.0); } WRITE8_MEMBER(opwolf_state::opwolf_adpcm_e_w) { -// logerror("CPU #1 e00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() ); + // total volume (speaker 2) + for (int i = 0; i <= 2; i++) + m_rspeaker->set_input_gain(i, data / 255.0); } @@ -975,14 +988,14 @@ MACHINE_CONFIG_START(opwolf_state::opwolf) MCFG_DEVICE_ADD("msm0", MSM5205, 384000) MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<0>)) MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */ - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.85) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.85) MCFG_DEVICE_ADD("msm1", MSM5205, 384000) MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<1>)) MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */ - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.85) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.85) MCFG_DEVICE_ADD("ciu", PC060HA, 0) MCFG_PC060HA_MASTER_CPU("maincpu") @@ -1050,14 +1063,14 @@ MACHINE_CONFIG_START(opwolf_state::opwolfb) /* OSC clocks unknown for the bootle MCFG_DEVICE_ADD("msm0", MSM5205, 384000) MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<0>)) MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */ - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.85) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.85) MCFG_DEVICE_ADD("msm1", MSM5205, 384000) MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<1>)) MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */ - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.85) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.85) MCFG_DEVICE_ADD("ciu", PC060HA, 0) MCFG_PC060HA_MASTER_CPU("maincpu") @@ -1268,8 +1281,6 @@ ROM_END // Regular rom set includes the string '11 Sep 1987' // C-Chip includes the string 'By_TAITO_Copration_On_OSAKA_BUNSHITU._01.Sep.1987_Toshiaki.Kato_Tsutomuawa_4 -// MACHINE_IMPERFECT_SOUND is present because the credit sound appears to double trigger. All other sounds seem correct. - // year rom parent machine inp state init GAME( 1987, opwolf, 0, opwolf, opwolf, opwolf_state, init_opwolf, ROT0, "Taito Corporation Japan", "Operation Wolf (World, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1987, opwolfa, opwolf, opwolf, opwolf, opwolf_state, init_opwolf, ROT0, "Taito Corporation Japan", "Operation Wolf (World, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/pc.cpp b/src/mame/drivers/pc.cpp index bc1db9a5efc..9f82b9e2cb9 100644 --- a/src/mame/drivers/pc.cpp +++ b/src/mame/drivers/pc.cpp @@ -454,8 +454,7 @@ void pc_state::epc_io(address_map &map) { map.unmap_value_high(); map(0x0000, 0x00ff).m("mb", FUNC(ibm5160_mb_device::map)); - map(0x0070, 0x0070).rw("i8251", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x0071, 0x0071).rw("i8251", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x0070, 0x0071).rw("i8251", FUNC(i8251_device::read), FUNC(i8251_device::write)); } INPUT_CHANGED_MEMBER(pc_state::pc_turbo_callback) diff --git a/src/mame/drivers/pc100.cpp b/src/mame/drivers/pc100.cpp index b92eaee0d04..c1dd19b6a40 100644 --- a/src/mame/drivers/pc100.cpp +++ b/src/mame/drivers/pc100.cpp @@ -347,8 +347,7 @@ void pc100_state::pc100_io(address_map &map) map(0x20, 0x23).r(FUNC(pc100_state::pc100_key_r)).umask16(0x00ff); //i/o, keyboard, mouse map(0x22, 0x22).w(FUNC(pc100_state::pc100_output_w)); //i/o, keyboard, mouse map(0x24, 0x24).w(FUNC(pc100_state::pc100_tc_w)); //i/o, keyboard, mouse - map(0x28, 0x28).rw("uart8251", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x2a, 0x2a).rw("uart8251", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x28, 0x2b).rw("uart8251", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0x30, 0x30).rw(FUNC(pc100_state::pc100_shift_r), FUNC(pc100_state::pc100_shift_w)); // crtc shift map(0x38, 0x38).w(FUNC(pc100_state::pc100_crtc_addr_w)); //crtc address reg map(0x3a, 0x3a).w(FUNC(pc100_state::pc100_crtc_data_w)); //crtc data reg diff --git a/src/mame/drivers/pc6001.cpp b/src/mame/drivers/pc6001.cpp index 3396f9e1736..285b9c140d7 100644 --- a/src/mame/drivers/pc6001.cpp +++ b/src/mame/drivers/pc6001.cpp @@ -240,8 +240,7 @@ void pc6001_state::pc6001_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); - map(0x80, 0x80).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x81, 0x81).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x80, 0x81).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x90, 0x93).mirror(0x0c).rw(FUNC(pc6001_state::nec_ppi8255_r), FUNC(pc6001_state::nec_ppi8255_w)); map(0xa0, 0xa0).mirror(0x0c).w("ay8910", FUNC(ay8910_device::address_w)); map(0xa1, 0xa1).mirror(0x0c).w("ay8910", FUNC(ay8910_device::data_w)); @@ -696,8 +695,7 @@ void pc6001mk2_state::pc6001mk2_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); - map(0x80, 0x80).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x81, 0x81).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x80, 0x81).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x90, 0x93).mirror(0x0c).rw(FUNC(pc6001mk2_state::nec_ppi8255_r), FUNC(pc6001mk2_state::necmk2_ppi8255_w)); @@ -933,8 +931,7 @@ void pc6001sr_state::pc6001sr_io(address_map &map) // 0x40-0x43 palette indexes map(0x60, 0x67).rw(FUNC(pc6001sr_state::sr_bank_rn_r), FUNC(pc6001sr_state::sr_bank_rn_w)); map(0x68, 0x6f).rw(FUNC(pc6001sr_state::sr_bank_wn_r), FUNC(pc6001sr_state::sr_bank_wn_w)); - map(0x80, 0x80).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x81, 0x81).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x80, 0x81).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x90, 0x93).mirror(0x0c).rw(FUNC(pc6001sr_state::nec_ppi8255_r), FUNC(pc6001sr_state::necsr_ppi8255_w)); diff --git a/src/mame/drivers/pc8001.cpp b/src/mame/drivers/pc8001.cpp index 4b15d2a3f6e..88fec2ddf37 100644 --- a/src/mame/drivers/pc8001.cpp +++ b/src/mame/drivers/pc8001.cpp @@ -188,8 +188,7 @@ void pc8001_state::pc8001_io(address_map &map) map(0x08, 0x08).portr("Y8"); map(0x09, 0x09).portr("Y9"); map(0x10, 0x10).mirror(0x0f).w(FUNC(pc8001_state::port10_w)); - map(0x20, 0x20).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x21, 0x21).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x20, 0x21).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x30, 0x30).mirror(0x0f).w(FUNC(pc8001_state::port30_w)); map(0x40, 0x40).mirror(0x0f).rw(FUNC(pc8001_state::port40_r), FUNC(pc8001_state::port40_w)); map(0x50, 0x51).rw(m_crtc, FUNC(upd3301_device::read), FUNC(upd3301_device::write)); diff --git a/src/mame/drivers/pc8401a.cpp b/src/mame/drivers/pc8401a.cpp index c70d2d835dc..f0c70f598a9 100644 --- a/src/mame/drivers/pc8401a.cpp +++ b/src/mame/drivers/pc8401a.cpp @@ -361,8 +361,7 @@ void pc8401a_state::pc8500_io(address_map &map) map(0x08, 0x08).portr("Y.8"); map(0x09, 0x09).portr("Y.9"); map(0x10, 0x10).w(FUNC(pc8401a_state::rtc_cmd_w)); - map(0x20, 0x20).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x21, 0x21).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x20, 0x21).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x30, 0x30).rw(FUNC(pc8401a_state::mmr_r), FUNC(pc8401a_state::mmr_w)); // AM_RANGE(0x31, 0x31) map(0x40, 0x40).rw(FUNC(pc8401a_state::rtc_r), FUNC(pc8401a_state::rtc_ctrl_w)); diff --git a/src/mame/drivers/pc8801.cpp b/src/mame/drivers/pc8801.cpp index b75c37bce6a..098301df216 100644 --- a/src/mame/drivers/pc8801.cpp +++ b/src/mame/drivers/pc8801.cpp @@ -1553,8 +1553,7 @@ void pc8801_state::pc8801_io(address_map &map) map(0x0f, 0x0f).portr("KEY15"); map(0x00, 0x02).w(FUNC(pc8801_state::pc8801_pcg8100_w)); map(0x10, 0x10).w(FUNC(pc8801_state::pc8801_rtc_w)); - map(0x20, 0x20).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); /* RS-232C and CMT */ - map(0x21, 0x21).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x20, 0x21).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)); /* RS-232C and CMT */ map(0x30, 0x30).portr("DSW1").w(FUNC(pc8801_state::pc8801_txt_cmt_ctrl_w)); map(0x31, 0x31).portr("DSW2").w(FUNC(pc8801_state::pc8801_gfx_ctrl_w)); map(0x32, 0x32).rw(FUNC(pc8801_state::pc8801_misc_ctrl_r), FUNC(pc8801_state::pc8801_misc_ctrl_w)); diff --git a/src/mame/drivers/pc9801.cpp b/src/mame/drivers/pc9801.cpp index f57ddeeb266..b49dbc553e7 100644 --- a/src/mame/drivers/pc9801.cpp +++ b/src/mame/drivers/pc9801.cpp @@ -675,8 +675,7 @@ void pc9801_state::pc9801_common_io(address_map &map) map(0x0090, 0x0090).r(m_fdc_2hd, FUNC(upd765a_device::msr_r)); map(0x0092, 0x0092).rw(m_fdc_2hd, FUNC(upd765a_device::fifo_r), FUNC(upd765a_device::fifo_w)); map(0x0094, 0x0094).rw(FUNC(pc9801_state::fdc_2hd_ctrl_r), FUNC(pc9801_state::fdc_2hd_ctrl_w)); - map(0x0091, 0x0091).rw(m_sio, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x0093, 0x0093).rw(m_sio, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x0090, 0x0093).rw(m_sio, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0xff00); map(0x7fd8, 0x7fdf).rw("ppi8255_mouse", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0xff00); } diff --git a/src/mame/drivers/pcat_dyn.cpp b/src/mame/drivers/pcat_dyn.cpp index 6aa0d303c17..72ff59519f0 100644 --- a/src/mame/drivers/pcat_dyn.cpp +++ b/src/mame/drivers/pcat_dyn.cpp @@ -33,8 +33,8 @@ If the output isn't satisfactory, it prints "I/O BOARD FAILURE". #include "bus/isa/isa.h" #include "bus/isa/sblaster.h" #include "bus/isa/trident.h" +#include "bus/rs232/hlemouse.h" #include "bus/rs232/rs232.h" -#include "bus/rs232/ser_mouse.h" #include "screen.h" @@ -145,7 +145,7 @@ INPUT_PORTS_END static void pcat_dyn_com(device_slot_interface &device) { - device.option_add("msmouse", MSYSTEM_SERIAL_MOUSE); + device.option_add("msmouse", MSYSTEMS_HLE_SERIAL_MOUSE); } static void pcat_dyn_isa8_cards(device_slot_interface &device) diff --git a/src/mame/drivers/pcipc.cpp b/src/mame/drivers/pcipc.cpp index 32e17547c61..08669a9b8dd 100644 --- a/src/mame/drivers/pcipc.cpp +++ b/src/mame/drivers/pcipc.cpp @@ -26,10 +26,11 @@ #include "machine/i82371sb.h" #include "video/mga2064w.h" #include "bus/isa/isa_cards.h" +#include "bus/rs232/hlemouse.h" +#include "bus/rs232/null_modem.h" #include "bus/rs232/rs232.h" -#include "bus/rs232/ser_mouse.h" +#include "bus/rs232/sun_kbd.h" #include "bus/rs232/terminal.h" -#include "bus/rs232/null_modem.h" #include "machine/fdc37c93x.h" class pcipc_state : public driver_device @@ -50,6 +51,8 @@ public: pcipc_state(const machine_config &mconfig, device_type type, const char *tag); private: + void pcipc_map(address_map &map); + void pcipc_map_io(address_map &map); DECLARE_WRITE8_MEMBER(boot_state_phoenix_w); DECLARE_WRITE8_MEMBER(boot_state_phoenix_ver40_rev6_w); DECLARE_WRITE8_MEMBER(boot_state_award_w); @@ -479,10 +482,14 @@ static void isa_internal_devices(device_slot_interface &device) static void isa_com(device_slot_interface &device) { - device.option_add("microsoft_mouse", MSFT_SERIAL_MOUSE); - device.option_add("msystems_mouse", MSYSTEM_SERIAL_MOUSE); + device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE); + device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE); + device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE); + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); + device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE); device.option_add("terminal", SERIAL_TERMINAL); device.option_add("null_modem", NULL_MODEM); + device.option_add("sun_kbd", SUN_KBD_ADAPTOR); } void pcipc_state::superio_config(device_t *device) @@ -501,8 +508,20 @@ void pcipc_state::superio_config(device_t *device) fdc.nrts2().set(":serport1", FUNC(rs232_port_device::write_rts)); } +void pcipc_state::pcipc_map(address_map &map) +{ + map.unmap_value_high(); +} + +void pcipc_state::pcipc_map_io(address_map &map) +{ + map.unmap_value_high(); +} + MACHINE_CONFIG_START(pcipc_state::pcipc) MCFG_DEVICE_ADD("maincpu", PENTIUM, 90000000) + MCFG_DEVICE_PROGRAM_MAP(pcipc_map) + MCFG_DEVICE_IO_MAP(pcipc_map_io) MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pci:07.0:pic8259_master", pic8259_device, inta_cb) MCFG_I386_SMIACT(WRITELINE("pci:00.0", i82439hx_host_device, smi_act_w)) @@ -525,7 +544,7 @@ MACHINE_CONFIG_START(pcipc_state::pcipc) MCFG_DEVICE_ADD("isa3", ISA16_SLOT, 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false) MCFG_DEVICE_ADD("isa4", ISA16_SLOT, 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false) MCFG_DEVICE_ADD("isa5", ISA16_SLOT, 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false) - MCFG_DEVICE_ADD("serport0", RS232_PORT, isa_com, "microsoft_mouse") + MCFG_DEVICE_ADD("serport0", RS232_PORT, isa_com, "logitech_mouse") MCFG_RS232_RXD_HANDLER(WRITELINE("board4:fdc37c93x", fdc37c93x_device, rxd1_w)) MCFG_RS232_DCD_HANDLER(WRITELINE("board4:fdc37c93x", fdc37c93x_device, ndcd1_w)) MCFG_RS232_DSR_HANDLER(WRITELINE("board4:fdc37c93x", fdc37c93x_device, ndsr1_w)) diff --git a/src/mame/drivers/pcw16.cpp b/src/mame/drivers/pcw16.cpp index 822c9dfb5e6..9c6e8b6accf 100644 --- a/src/mame/drivers/pcw16.cpp +++ b/src/mame/drivers/pcw16.cpp @@ -91,8 +91,8 @@ TODO: #include "emu.h" #include "includes/pcw16.h" +#include "bus/rs232/hlemouse.h" #include "bus/rs232/rs232.h" -#include "bus/rs232/ser_mouse.h" #include "screen.h" #include "softlist.h" #include "speaker.h" @@ -1007,7 +1007,7 @@ INPUT_PORTS_END static void pcw16_com(device_slot_interface &device) { - device.option_add("msystems_mouse", MSYSTEM_SERIAL_MOUSE); + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); } MACHINE_CONFIG_START(pcw16_state::pcw16) diff --git a/src/mame/drivers/peoplepc.cpp b/src/mame/drivers/peoplepc.cpp index 9d45727b24e..565fa2c21c3 100644 --- a/src/mame/drivers/peoplepc.cpp +++ b/src/mame/drivers/peoplepc.cpp @@ -212,10 +212,8 @@ void peoplepc_state::peoplepc_io(address_map &map) map(0x0020, 0x0031).rw(m_dmac, FUNC(i8257_device::read), FUNC(i8257_device::write)).umask16(0x00ff); map(0x0040, 0x0047).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); map(0x0048, 0x004f).rw("pit8253", FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); - map(0x0054, 0x0054).rw(m_8251key, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x0056, 0x0056).rw(m_8251key, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x005c, 0x005c).rw(m_8251ser, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x005e, 0x005e).rw(m_8251ser, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x0054, 0x0057).rw(m_8251key, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); + map(0x005c, 0x005f).rw(m_8251ser, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0x0064, 0x0067).m(m_fdc, FUNC(upd765a_device::map)).umask16(0x00ff); map(0x006c, 0x006c).w("h46505", FUNC(mc6845_device::address_w)); map(0x006e, 0x006e).rw("h46505", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); diff --git a/src/mame/drivers/pg685.cpp b/src/mame/drivers/pg685.cpp index 60a6f89e2ad..177fadb2ca4 100644 --- a/src/mame/drivers/pg685.cpp +++ b/src/mame/drivers/pg685.cpp @@ -167,14 +167,12 @@ void pg685_state::pg675_mem(address_map &map) map(0xf9f03, 0xf9f03).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); map(0xf9f04, 0xf9f04).rw(FUNC(pg685_state::f9f04_r), FUNC(pg685_state::f9f04_w)); map(0xf9f06, 0xf9f07).rw("mainpic", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); - map(0xf9f08, 0xf9f08).rw("mainuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf9f09, 0xf9f09).rw("mainuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf9f08, 0xf9f09).rw("mainuart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xf9f20, 0xf9f23).rw(m_fdc, FUNC(fd1797_device::read), FUNC(fd1797_device::write)); map(0xf9f24, 0xf9f24).rw(FUNC(pg685_state::f9f24_r), FUNC(pg685_state::f9f24_w)); map(0xf9f28, 0xf9f2b).rw("modppi1", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xf9f2c, 0xf9f2f).rw("modppi2", FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0xf9f30, 0xf9f30).rw("moduart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf9f31, 0xf9f31).rw("moduart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf9f30, 0xf9f31).rw("moduart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xf9f32, 0xf9f32).w(FUNC(pg685_state::f9f32_w)); map(0xf9f33, 0xf9f33).r(FUNC(pg685_state::f9f33_r)); map(0xf9f40, 0xf9f5f).rw("rtc", FUNC(mm58167_device::read), FUNC(mm58167_device::write)); @@ -205,14 +203,12 @@ void pg685_state::pg685oua12_mem(address_map &map) map(0xf9f00, 0xf9f01).rw("kbdc", FUNC(i8279_device::read), FUNC(i8279_device::write)); map(0xf9f04, 0xf9f04).rw(FUNC(pg685_state::f9f04_r), FUNC(pg685_state::f9f04_w)); map(0xf9f06, 0xf9f07).rw("mainpic", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); - map(0xf9f08, 0xf9f08).rw("mainuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf9f09, 0xf9f09).rw("mainuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf9f08, 0xf9f09).rw("mainuart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xf9f20, 0xf9f23).rw(m_fdc, FUNC(fd1797_device::read), FUNC(fd1797_device::write)); map(0xf9f24, 0xf9f24).rw(FUNC(pg685_state::f9f24_r), FUNC(pg685_state::f9f24_w)); map(0xf9f28, 0xf9f2b).rw("modppi1", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xf9f2c, 0xf9f2f).rw("modppi2", FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0xf9f30, 0xf9f30).rw("moduart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf9f31, 0xf9f31).rw("moduart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf9f30, 0xf9f31).rw("moduart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xf9f32, 0xf9f32).w(FUNC(pg685_state::f9f32_w)); map(0xf9f33, 0xf9f33).r(FUNC(pg685_state::f9f33_r)); map(0xf9f34, 0xf9f37).rw("bppit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); diff --git a/src/mame/drivers/pimps.cpp b/src/mame/drivers/pimps.cpp index b93bacbd965..e7d2cbf5918 100644 --- a/src/mame/drivers/pimps.cpp +++ b/src/mame/drivers/pimps.cpp @@ -103,10 +103,8 @@ void pimps_state::mem_map(address_map &map) void pimps_state::io_map(address_map &map) { map.unmap_value_high(); - map(0xf0, 0xf0).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf1, 0xf1).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xf2, 0xf2).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf3, 0xf3).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf0, 0xf1).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0xf2, 0xf3).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); } /* Input ports */ diff --git a/src/mame/drivers/poly88.cpp b/src/mame/drivers/poly88.cpp index 218b727a0e9..c6177449de5 100644 --- a/src/mame/drivers/poly88.cpp +++ b/src/mame/drivers/poly88.cpp @@ -65,8 +65,7 @@ void poly88_state::poly88_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); - map(0x00, 0x00).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x01, 0x01).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x00, 0x01).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x04, 0x04).w(FUNC(poly88_state::poly88_baud_rate_w)); map(0x08, 0x08).w(FUNC(poly88_state::poly88_intr_w)); map(0xf8, 0xf8).r(FUNC(poly88_state::poly88_keyboard_r)); diff --git a/src/mame/drivers/pp01.cpp b/src/mame/drivers/pp01.cpp index 1e0a6460d8b..3263cf7f740 100644 --- a/src/mame/drivers/pp01.cpp +++ b/src/mame/drivers/pp01.cpp @@ -40,8 +40,7 @@ void pp01_state::pp01_io(address_map &map) { map(0xc0, 0xc3).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)); // system //AM_RANGE(0xc4, 0xc7) AM_DEVREADWRITE("ppi8255", i8255_device, read, write) // user - map(0xc8, 0xc8).mirror(2).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xc9, 0xc9).mirror(2).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xc8, 0xc9).mirror(2).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xcc, 0xcf).w(FUNC(pp01_state::pp01_video_write_mode_w)); map(0xd0, 0xd3).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0xe0, 0xef).mirror(0x10).rw(FUNC(pp01_state::pp01_mem_block_r), FUNC(pp01_state::pp01_mem_block_w)); diff --git a/src/mame/drivers/psx.cpp b/src/mame/drivers/psx.cpp index 1d4260396d8..15f9e6f6adf 100644 --- a/src/mame/drivers/psx.cpp +++ b/src/mame/drivers/psx.cpp @@ -519,8 +519,8 @@ void psx1_state::subcpu_map(address_map &map) MACHINE_CONFIG_START(psx1_state::psj) /* basic machine hardware */ - MCFG_DEVICE_ADD( "maincpu", CXD8530CQ, XTAL(67'737'600) ) - MCFG_DEVICE_PROGRAM_MAP( psx_map ) + CXD8530CQ(config, m_maincpu, XTAL(67'737'600)); + m_maincpu->set_addrmap(AS_PROGRAM, &psx1_state::psx_map); subdevice<ram_device>("maincpu:ram")->set_default_size("2M"); @@ -530,10 +530,10 @@ MACHINE_CONFIG_START(psx1_state::psj) MCFG_PSX_CTRL_PORT_ADD("port1", psx_controllers, "digital_pad") MCFG_PSX_CTRL_PORT_ADD("port2", psx_controllers, "digital_pad") - MCFG_DEVICE_MODIFY("maincpu:sio0") - MCFG_PSX_SIO_DTR_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_dtr)) - MCFG_PSX_SIO_SCK_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_sck)) - MCFG_PSX_SIO_TXD_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_txd)) + auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0")); + sio0.dtr_handler().set("controllers", FUNC(psxcontrollerports_device::write_dtr)); + sio0.sck_handler().set("controllers", FUNC(psxcontrollerports_device::write_sck)); + sio0.txd_handler().set("controllers", FUNC(psxcontrollerports_device::write_txd)); /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL(53'693'175) ) @@ -572,8 +572,8 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(psx1_state::pse) /* basic machine hardware */ - MCFG_DEVICE_ADD( "maincpu", CXD8530AQ, XTAL(67'737'600) ) - MCFG_DEVICE_PROGRAM_MAP( psx_map) + CXD8530AQ(config, m_maincpu, XTAL(67'737'600)); + m_maincpu->set_addrmap(AS_PROGRAM, &psx1_state::psx_map); subdevice<ram_device>("maincpu:ram")->set_default_size("2M"); @@ -583,10 +583,10 @@ MACHINE_CONFIG_START(psx1_state::pse) MCFG_PSX_CTRL_PORT_ADD("port1", psx_controllers, "digital_pad") MCFG_PSX_CTRL_PORT_ADD("port2", psx_controllers, "digital_pad") - MCFG_DEVICE_MODIFY("maincpu:sio0") - MCFG_PSX_SIO_DTR_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_dtr)) - MCFG_PSX_SIO_SCK_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_sck)) - MCFG_PSX_SIO_TXD_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_txd)) + auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0")); + sio0.dtr_handler().set("controllers", FUNC(psxcontrollerports_device::write_dtr)); + sio0.sck_handler().set("controllers", FUNC(psxcontrollerports_device::write_sck)); + sio0.txd_handler().set("controllers", FUNC(psxcontrollerports_device::write_txd)); /* video hardware */ /* TODO: visible area and refresh rate */ diff --git a/src/mame/drivers/pwrview.cpp b/src/mame/drivers/pwrview.cpp index 98b580297d6..0e66b61a15e 100644 --- a/src/mame/drivers/pwrview.cpp +++ b/src/mame/drivers/pwrview.cpp @@ -392,8 +392,7 @@ void pwrview_state::pwrview_io(address_map &map) map(0xc280, 0xc287).rw(FUNC(pwrview_state::unk3_r), FUNC(pwrview_state::unk3_w)).umask16(0x00ff); map(0xc288, 0xc28f).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); map(0xc2a0, 0xc2a7).rw("sio", FUNC(z80sio2_device::cd_ba_r), FUNC(z80sio2_device::cd_ba_w)).umask16(0x00ff); - map(0xc2c0, 0xc2c0).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xc2c2, 0xc2c2).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xc2c0, 0xc2c3).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0xc2e0, 0xc2e3).m("fdc", FUNC(upd765a_device::map)).umask16(0x00ff); map(0xc2e4, 0xc2e5).ram(); map(0xc2e6, 0xc2e6).r(FUNC(pwrview_state::pitclock_r)); diff --git a/src/mame/drivers/px8.cpp b/src/mame/drivers/px8.cpp index 4f13ddcefec..af96e8c3c7a 100644 --- a/src/mame/drivers/px8.cpp +++ b/src/mame/drivers/px8.cpp @@ -527,8 +527,7 @@ void px8_state::px8_io(address_map &map) map.unmap_value_high(); map.global_mask(0x0f); map(0x00, 0x07).rw(FUNC(px8_state::gah40m_r), FUNC(px8_state::gah40m_w)); - map(0x0c, 0x0c).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x0d, 0x0d).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x0c, 0x0d).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)); // AM_RANGE(0x0e, 0x0e) AM_DEVREADWRITE(SED1320_TAG, sed1330_device, status_r, data_w) // AM_RANGE(0x0f, 0x0f) AM_DEVREADWRITE(SED1320_TAG, sed1330_device, data_r, command_w) } diff --git a/src/mame/drivers/qtsbc.cpp b/src/mame/drivers/qtsbc.cpp index 7bdc8061e12..6e4ca0e4688 100644 --- a/src/mame/drivers/qtsbc.cpp +++ b/src/mame/drivers/qtsbc.cpp @@ -150,10 +150,8 @@ READ8_MEMBER(qtsbc_state::io_r) return 0xff; case 6: - return m_usart->data_r(space, 0); - case 7: - return m_usart->status_r(space, 0); + return m_usart->read(offset & 1); } } else @@ -192,11 +190,8 @@ WRITE8_MEMBER(qtsbc_state::io_w) break; case 6: - m_usart->data_w(space, 0, data); - break; - case 7: - m_usart->control_w(space, 0, data); + m_usart->write(offset & 1, data); break; } } diff --git a/src/mame/drivers/rainbow.cpp b/src/mame/drivers/rainbow.cpp index 83918c57854..37bcfef0172 100644 --- a/src/mame/drivers/rainbow.cpp +++ b/src/mame/drivers/rainbow.cpp @@ -356,8 +356,8 @@ W17 pulls J1 serial port pin 1 to GND when set (chassis to logical GND). #include "bus/rs232/rs232.h" #include "imagedev/bitbngr.h" #include "machine/com8116.h" +#include "bus/rs232/hlemouse.h" #include "bus/rs232/terminal.h" -#include "bus/rs232/ser_mouse.h" #include "machine/i8251.h" #include "machine/dec_lk201.h" @@ -957,8 +957,7 @@ void rainbow_state::rainbow8088_io(address_map &map) map(0x0e, 0x0e).w(FUNC(rainbow_state::printer_bitrate_w)); - map(0x10, 0x10).rw(m_kbd8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x11, 0x11).rw(m_kbd8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x10, 0x11).rw(m_kbd8251, FUNC(i8251_device::read), FUNC(i8251_device::write)); // =========================================================== // There are 4 select lines for Option Select 1 to 4 @@ -3327,9 +3326,10 @@ MACHINE_CONFIG_START(rainbow_state::rainbow) MCFG_RS232_DCD_HANDLER(WRITELINE(m_mpsc, upd7201_new_device, ctsb_w)) // actually DTR MCFG_DEVICE_MODIFY("comm") - MCFG_SLOT_OPTION_ADD("microsoft_mouse", MSFT_SERIAL_MOUSE) - MCFG_SLOT_OPTION_ADD("mouse_systems_mouse", MSYSTEM_SERIAL_MOUSE) - MCFG_SLOT_DEFAULT_OPTION("microsoft_mouse") + MCFG_SLOT_OPTION_ADD("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE) + MCFG_SLOT_OPTION_ADD("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE) + MCFG_SLOT_OPTION_ADD("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE) + MCFG_SLOT_DEFAULT_OPTION("logitech_mouse") MCFG_DEVICE_MODIFY("printer") MCFG_SLOT_DEFAULT_OPTION("printer") diff --git a/src/mame/drivers/sage2.cpp b/src/mame/drivers/sage2.cpp index 02962af2659..b3a7ddd1eb6 100644 --- a/src/mame/drivers/sage2.cpp +++ b/src/mame/drivers/sage2.cpp @@ -42,13 +42,11 @@ void sage2_state::sage2_mem(address_map &map) map(0xffc000, 0xffc007).rw(I8253_1_TAG, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); map(0xffc010, 0xffc01f).noprw(); //AM_DEVREADWRITE8(TMS9914_TAG, tms9914_device, read, write, 0x00ff) map(0xffc020, 0xffc027).rw(I8255A_0_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); // i8255, DIPs + Floppy ctrl port - map(0xffc031, 0xffc031).rw(m_usart1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xffc033, 0xffc033).rw(m_usart1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xffc030, 0xffc033).rw(m_usart1, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0xffc040, 0xffc043).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); map(0xffc050, 0xffc053).m(m_fdc, FUNC(upd765a_device::map)).umask16(0x00ff); map(0xffc060, 0xffc067).rw(I8255A_1_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); // i8255, Printer - map(0xffc071, 0xffc071).rw(m_usart0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xffc073, 0xffc073).rw(m_usart0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xffc070, 0xffc073).rw(m_usart0, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0xffc080, 0xffc087).mirror(0x78).rw(I8253_0_TAG, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); // AM_RANGE(0xffc400, 0xffc407) AM_DEVREADWRITE8(S2651_0_TAG, s2651_device, read, write, 0x00ff) // AM_RANGE(0xffc440, 0xffc447) AM_DEVREADWRITE8(S2651_1_TAG, s2651_device, read, write, 0x00ff) diff --git a/src/mame/drivers/sbrain.cpp b/src/mame/drivers/sbrain.cpp index fc1b7caa0ff..8b088a092d1 100644 --- a/src/mame/drivers/sbrain.cpp +++ b/src/mame/drivers/sbrain.cpp @@ -138,12 +138,10 @@ void sbrain_state::sbrain_mem(address_map &map) void sbrain_state::sbrain_io(address_map &map) { map.global_mask(0xff); - map(0x40, 0x40).mirror(6).rw(m_u0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x41, 0x41).mirror(6).rw(m_u0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x40, 0x41).mirror(6).rw(m_u0, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x48, 0x4f).r(FUNC(sbrain_state::port48_r)); //chr_int_latch map(0x50, 0x57).r(FUNC(sbrain_state::port50_r)); - map(0x58, 0x58).mirror(6).rw(m_u1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x59, 0x59).mirror(6).rw(m_u1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x58, 0x59).mirror(6).rw(m_u1, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x60, 0x60).mirror(7).w("brg", FUNC(com8116_device::stt_str_w)); map(0x68, 0x6b).mirror(4).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)); } diff --git a/src/mame/drivers/scopus.cpp b/src/mame/drivers/scopus.cpp index 8f0d45ed5ea..1228aa52d88 100644 --- a/src/mame/drivers/scopus.cpp +++ b/src/mame/drivers/scopus.cpp @@ -133,8 +133,7 @@ void sagitta180_state::maincpu_map(address_map &map) void sagitta180_state::maincpu_io_map(address_map &map) { map(0x00, 0x00).portr("DSW"); - map(0x20, 0x20).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x21, 0x21).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x20, 0x21).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x30, 0x31).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); map(0x40, 0x48).rw(m_dma8257, FUNC(i8257_device::read), FUNC(i8257_device::write)); } diff --git a/src/mame/drivers/sdk80.cpp b/src/mame/drivers/sdk80.cpp index ebdc7cd6a2d..1a3be1c2c6f 100644 --- a/src/mame/drivers/sdk80.cpp +++ b/src/mame/drivers/sdk80.cpp @@ -83,8 +83,7 @@ void sdk80_state::sdk80_io(address_map &map) map.global_mask(0xff); map(0xec, 0xef).rw(m_ppi_1, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0xf4, 0xf7).rw(m_ppi_0, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0xfa, 0xfa).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xfb, 0xfb).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xfa, 0xfb).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); } static INPUT_PORTS_START( sdk80 ) diff --git a/src/mame/drivers/sdk86.cpp b/src/mame/drivers/sdk86.cpp index 7bec26e7c31..bec2b643446 100644 --- a/src/mame/drivers/sdk86.cpp +++ b/src/mame/drivers/sdk86.cpp @@ -73,8 +73,7 @@ void sdk86_state::sdk86_mem(address_map &map) void sdk86_state::sdk86_io(address_map &map) { map.unmap_value_high(); - map(0xfff0, 0xfff0).mirror(4).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xfff2, 0xfff2).mirror(4).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xfff0, 0xfff3).mirror(4).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0xffe8, 0xffeb).mirror(4).rw("i8279", FUNC(i8279_device::read), FUNC(i8279_device::write)).umask16(0x00ff); map(0xfff8, 0xffff).rw("port1", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0xff00); map(0xfff8, 0xffff).rw("port2", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); diff --git a/src/mame/drivers/seattlecmp.cpp b/src/mame/drivers/seattlecmp.cpp index 0d9a1745a07..eaedcf1ab3f 100644 --- a/src/mame/drivers/seattlecmp.cpp +++ b/src/mame/drivers/seattlecmp.cpp @@ -83,8 +83,7 @@ void seattle_comp_state::io_map(address_map &map) map(0xf0, 0xf1).rw("pic1", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0xf2, 0xf3).rw("pic2", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0xf4, 0xf5).rw("stc", FUNC(am9513_device::read8), FUNC(am9513_device::write8)); - map(0xf6, 0xf6).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xf7, 0xf7).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xf6, 0xf7).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); //AM_RANGE(0xfc, 0xfd) Parallel data, status, serial DCD //AM_RANGE(0xfe, 0xff) Eprom disable bit, read sense switches (bank of 8 dipswitches) } diff --git a/src/mame/drivers/segam1.cpp b/src/mame/drivers/segam1.cpp index 6894a9183ae..944e974b39d 100644 --- a/src/mame/drivers/segam1.cpp +++ b/src/mame/drivers/segam1.cpp @@ -235,8 +235,7 @@ void segam1_state::segam1_comms_map(address_map &map) map(0x0000, 0x7fff).rom(); map(0x8000, 0x9fff).ram(); map(0xa000, 0xa7ff).rw("dpram", FUNC(mb8421_device::left_r), FUNC(mb8421_device::left_w)); - map(0xc000, 0xc000).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xc001, 0xc001).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xc000, 0xc001).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xe003, 0xe003).nopw(); // ??? } diff --git a/src/mame/drivers/seibucats.cpp b/src/mame/drivers/seibucats.cpp index 7e29e907ea1..45d9018dacf 100644 --- a/src/mame/drivers/seibucats.cpp +++ b/src/mame/drivers/seibucats.cpp @@ -184,10 +184,8 @@ void seibucats_state::seibucats_map(address_map &map) map(0x01200000, 0x01200007).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask32(0x000000ff); map(0x01200100, 0x01200107).nopw(); // YMF721-S MIDI data map(0x01200104, 0x01200107).nopr(); // YMF721-S MIDI status - map(0x01200200, 0x01200200).rw("usart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x01200204, 0x01200204).rw("usart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x01200300, 0x01200300).rw("usart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x01200304, 0x01200304).rw("usart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x01200200, 0x01200207).rw("usart1", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask32(0x000000ff); + map(0x01200300, 0x01200307).rw("usart2", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask32(0x000000ff); map(0xa0000000, 0xa1ffffff).noprw(); // NVRAM on ROM board map(0xa2000000, 0xa2000001).w(FUNC(seibucats_state::aux_rtc_w)); map(0xffe00000, 0xffffffff).rom().region("ipl", 0); diff --git a/src/mame/drivers/selz80.cpp b/src/mame/drivers/selz80.cpp index ef9388a11e5..ca1ac40da97 100644 --- a/src/mame/drivers/selz80.cpp +++ b/src/mame/drivers/selz80.cpp @@ -95,8 +95,7 @@ void selz80_state::selz80_io(address_map &map) map.unmap_value_high(); map.global_mask(0xff); map(0x00, 0x01).rw("i8279", FUNC(i8279_device::read), FUNC(i8279_device::write)); - map(0x18, 0x18).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x19, 0x19).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x18, 0x19).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); } /* Input ports */ diff --git a/src/mame/drivers/sg1000.cpp b/src/mame/drivers/sg1000.cpp index 5b4b29f1c78..d7a5a34579e 100644 --- a/src/mame/drivers/sg1000.cpp +++ b/src/mame/drivers/sg1000.cpp @@ -228,8 +228,7 @@ void sf7000_state::sf7000_io_map(address_map &map) map(0xdc, 0xdf).rw(FUNC(sf7000_state::peripheral_r), FUNC(sf7000_state::peripheral_w)); map(0xe0, 0xe1).m(m_fdc, FUNC(upd765a_device::map)); map(0xe4, 0xe7).rw(UPD9255_1_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0xe8, 0xe8).rw(UPD8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xe9, 0xe9).rw(UPD8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xe8, 0xe9).rw(UPD8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)); } /*************************************************************************** diff --git a/src/mame/drivers/sm1800.cpp b/src/mame/drivers/sm1800.cpp index b56ae565924..6d8cc7187d6 100644 --- a/src/mame/drivers/sm1800.cpp +++ b/src/mame/drivers/sm1800.cpp @@ -71,8 +71,7 @@ void sm1800_state::sm1800_io(address_map &map) map.global_mask(0xff); map.unmap_value_high(); map(0x3c, 0x3d).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); - map(0x5c, 0x5c).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x5d, 0x5d).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x5c, 0x5d).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x6c, 0x6f).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)); //AM_RANGE( 0x74, 0x74 ) AM_DEVREADWRITE("i8279", i8279_device, status_r, cmd_w) //AM_RANGE( 0x75, 0x75 ) AM_DEVREADWRITE("i8279", i8279_device, data_r, data_w) diff --git a/src/mame/drivers/sm7238.cpp b/src/mame/drivers/sm7238.cpp index 42865b42358..1a1c26dafda 100644 --- a/src/mame/drivers/sm7238.cpp +++ b/src/mame/drivers/sm7238.cpp @@ -150,16 +150,13 @@ void sm7238_state::sm7238_io(address_map &map) { map.unmap_value_high(); // AM_RANGE (0x40, 0x4f) AM_RAM // LUT - map(0xa0, 0xa0).rw(m_i8251line, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xa1, 0xa1).rw(m_i8251line, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0xa4, 0xa4).rw(m_i8251kbd, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xa5, 0xa5).rw(m_i8251kbd, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xa0, 0xa1).rw(m_i8251line, FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0xa4, 0xa5).rw(m_i8251kbd, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xa8, 0xab).rw(m_t_color, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0xac, 0xad).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0xb0, 0xb3).rw(m_t_hblank, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0xb4, 0xb7).rw(m_t_vblank, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); - map(0xb8, 0xb8).rw(m_i8251prn, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xb9, 0xb9).rw(m_i8251prn, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xb8, 0xb9).rw(m_i8251prn, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xbc, 0xbf).rw(m_t_iface, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); } diff --git a/src/mame/drivers/softbox.cpp b/src/mame/drivers/softbox.cpp index dcb1c435812..7ec99a421fe 100644 --- a/src/mame/drivers/softbox.cpp +++ b/src/mame/drivers/softbox.cpp @@ -126,8 +126,7 @@ void softbox_state::softbox_mem(address_map &map) void softbox_state::softbox_io(address_map &map) { map.global_mask(0xff); - map(0x08, 0x08).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x09, 0x09).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x08, 0x09).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x0c, 0x0c).w(COM8116_TAG, FUNC(com8116_device::stt_str_w)); map(0x10, 0x13).rw(I8255_0_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x14, 0x17).rw(I8255_1_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)); diff --git a/src/mame/drivers/sun3.cpp b/src/mame/drivers/sun3.cpp index 76f36d39ee0..0e51c328214 100644 --- a/src/mame/drivers/sun3.cpp +++ b/src/mame/drivers/sun3.cpp @@ -187,9 +187,14 @@ fefc34a - start of mem_size, which queries ECC registers for each memory board #include "machine/timekpr.h" #include "machine/timer.h" #include "machine/z80scc.h" +#include "machine/am79c90.h" +#include "machine/ncr5380n.h" +#include "machine/nscsi_cd.h" +#include "machine/nscsi_hd.h" #include "bus/rs232/rs232.h" #include "bus/sunkbd/sunkbd.h" +#include "bus/sunmouse/sunmouse.h" #include "screen.h" @@ -200,6 +205,7 @@ fefc34a - start of mem_size, which queries ECC registers for each memory board #define RS232A_TAG "rs232a" #define RS232B_TAG "rs232b" #define KEYBOARD_TAG "keyboard" +#define MOUSE_TAG "mouseport" // page table entry constants #define PM_VALID (0x80000000) // page is valid @@ -225,6 +231,8 @@ public: m_maincpu(*this, "maincpu"), m_scc1(*this, SCC1_TAG), m_scc2(*this, SCC2_TAG), + m_scsibus(*this, "scsibus"), + m_scsi(*this, "scsibus:7:ncr5380"), m_p_ram(*this, "p_ram"), m_bw2_vram(*this, "bw2_vram"), m_type0space(*this, "type0"), @@ -233,7 +241,8 @@ public: m_type3space(*this, "type3"), m_rom(*this, "user1"), m_idprom(*this, "idprom"), - m_ram(*this, RAM_TAG) + m_ram(*this, RAM_TAG), + m_lance(*this, "lance") { } void sun3(machine_config &config); @@ -242,10 +251,15 @@ public: void sun3200(machine_config &config); void sun3_50(machine_config &config); + void ncr5380(device_t *device); + private: required_device<m68020_device> m_maincpu; required_device<z80scc_device> m_scc1; required_device<z80scc_device> m_scc2; + required_device<nscsi_bus_device> m_scsibus; + required_device<ncr5380n_device> m_scsi; + virtual void machine_start() override; virtual void machine_reset() override; @@ -254,6 +268,7 @@ private: optional_device<address_map_bank_device> m_type0space, m_type1space, m_type2space, m_type3space; required_memory_region m_rom, m_idprom; required_device<ram_device> m_ram; + required_device<am79c90_device> m_lance; DECLARE_READ32_MEMBER( tl_mmu_r ); DECLARE_WRITE32_MEMBER( tl_mmu_w ); @@ -295,6 +310,27 @@ private: uint32_t m_cache_tags[0x4000], m_cache_data[0x4000]; }; +static void sun_cdrom(device_t *device) +{ + downcast<nscsi_cdrom_device &>(*device).set_block_size(512); +} + +void sun3_state::ncr5380(device_t *device) +{ + devcb_base *devcb; + (void)devcb; + MCFG_DEVICE_CLOCK(10000000) +// MCFG_NCR5380N_DRQ_HANDLER(WRITELINE(*this, sun3_state, drq_w)) +} + +static void scsi_devices(device_slot_interface &device) +{ + device.option_add("cdrom", NSCSI_CDROM); + device.option_add("harddisk", NSCSI_HARDDISK); + device.option_add_internal("ncr5380", NCR5380N); + device.set_option_machine_config("cdrom", sun_cdrom); +} + READ32_MEMBER( sun3_state::ram_r ) { if (m_ecc[0] == 0x10c00000) @@ -750,6 +786,8 @@ void sun3_state::vmetype1space_map(address_map &map) map(0x00080000, 0x0008000f).rw(FUNC(sun3_state::parity_r), FUNC(sun3_state::parity_w)); map(0x000a0000, 0x000a0003).rw(FUNC(sun3_state::irqctrl_r), FUNC(sun3_state::irqctrl_w)); map(0x00100000, 0x0010ffff).rom().region("user1", 0); + map(0x00120000, 0x00120003).rw(m_lance, FUNC(am79c90_device::regs_r), FUNC(am79c90_device::regs_w)); + map(0x00140000, 0x00140007).rw(m_scsi, FUNC(ncr5380n_device::read), FUNC(ncr5380n_device::write)).umask32(0xffffffff); map(0x001e0000, 0x001e00ff).rw(FUNC(sun3_state::ecc_r), FUNC(sun3_state::ecc_w)); } @@ -1001,9 +1039,12 @@ MACHINE_CONFIG_START(sun3_state::sun3) SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd)); + m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd)); SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w)); + SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w)); + SCC8530N(config, m_scc2, 4.9152_MHz_XTAL); m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd)); m_scc2->out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd)); @@ -1017,6 +1058,19 @@ MACHINE_CONFIG_START(sun3_state::sun3) MCFG_RS232_RXD_HANDLER(WRITELINE(m_scc2, z80scc_device, rxb_w)) MCFG_RS232_DCD_HANDLER(WRITELINE(m_scc2, z80scc_device, dcdb_w)) MCFG_RS232_CTS_HANDLER(WRITELINE(m_scc2, z80scc_device, ctsb_w)) + + AM79C90(config, m_lance, 10'000'000); // clock is a guess + + MCFG_NSCSI_BUS_ADD("scsibus") + MCFG_NSCSI_ADD("scsibus:0", scsi_devices, nullptr, false) + MCFG_NSCSI_ADD("scsibus:1", scsi_devices, "harddisk", false) + MCFG_NSCSI_ADD("scsibus:2", scsi_devices, nullptr, false) + MCFG_NSCSI_ADD("scsibus:3", scsi_devices, nullptr, false) + MCFG_NSCSI_ADD("scsibus:4", scsi_devices, nullptr, false) + MCFG_NSCSI_ADD("scsibus:5", scsi_devices, nullptr, false) + MCFG_NSCSI_ADD("scsibus:6", scsi_devices, "cdrom", false) + MCFG_NSCSI_ADD("scsibus:7", scsi_devices, "ncr5380", true) + MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", [this] (device_t *device) { ncr5380(device); }) MACHINE_CONFIG_END // Sun 3/60 @@ -1035,6 +1089,7 @@ MACHINE_CONFIG_END // Sun 3/E MACHINE_CONFIG_START(sun3_state::sun3e) sun3(config); + MCFG_DEVICE_REPLACE("maincpu", M68020, 20000000) MCFG_DEVICE_PROGRAM_MAP(sun3_mem) MACHINE_CONFIG_END @@ -1059,6 +1114,8 @@ MACHINE_CONFIG_START(sun3_state::sun3_50) MCFG_DEVICE_ADD("maincpu", M68020, 15700000) MCFG_DEVICE_PROGRAM_MAP(sun3_mem) + AM79C90(config, m_lance, 10'000'000); // clock is a guess + MCFG_SCREEN_ADD("bwtwo", RASTER) MCFG_SCREEN_UPDATE_DRIVER(sun3_state, bw2_350_update) MCFG_SCREEN_SIZE(1600,1100) @@ -1085,9 +1142,12 @@ MACHINE_CONFIG_START(sun3_state::sun3_50) SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd)); + m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd)); SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w)); + SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w)); + SCC8530N(config, m_scc2, 4.9152_MHz_XTAL); m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd)); m_scc2->out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd)); @@ -1101,6 +1161,17 @@ MACHINE_CONFIG_START(sun3_state::sun3_50) MCFG_RS232_RXD_HANDLER(WRITELINE(m_scc2, z80scc_device, rxb_w)) MCFG_RS232_DCD_HANDLER(WRITELINE(m_scc2, z80scc_device, dcdb_w)) MCFG_RS232_CTS_HANDLER(WRITELINE(m_scc2, z80scc_device, ctsb_w)) + + MCFG_NSCSI_BUS_ADD("scsibus") + MCFG_NSCSI_ADD("scsibus:0", scsi_devices, nullptr, false) + MCFG_NSCSI_ADD("scsibus:1", scsi_devices, "harddisk", false) + MCFG_NSCSI_ADD("scsibus:2", scsi_devices, nullptr, false) + MCFG_NSCSI_ADD("scsibus:3", scsi_devices, nullptr, false) + MCFG_NSCSI_ADD("scsibus:4", scsi_devices, nullptr, false) + MCFG_NSCSI_ADD("scsibus:5", scsi_devices, nullptr, false) + MCFG_NSCSI_ADD("scsibus:6", scsi_devices, "cdrom", false) + MCFG_NSCSI_ADD("scsibus:7", scsi_devices, "ncr5380", true) + MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", [this] (device_t *device) { ncr5380(device); }) MACHINE_CONFIG_END /* ROM definition */ diff --git a/src/mame/drivers/sun3x.cpp b/src/mame/drivers/sun3x.cpp index 1607affc44a..f07021c3dc2 100644 --- a/src/mame/drivers/sun3x.cpp +++ b/src/mame/drivers/sun3x.cpp @@ -143,6 +143,7 @@ #include "bus/rs232/rs232.h" #include "bus/sunkbd/sunkbd.h" +#include "bus/sunmouse/sunmouse.h" #include "screen.h" @@ -156,6 +157,7 @@ #define RS232A_TAG "rs232a" #define RS232B_TAG "rs232b" #define KEYBOARD_TAG "keyboard" +#define MOUSE_TAG "mouseport" class sun3x_state : public driver_device { @@ -597,8 +599,10 @@ MACHINE_CONFIG_START(sun3x_state::sun3_80) SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd)); + m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd)); SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w)); + SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w)); SCC8530N(config, m_scc2, 4.9152_MHz_XTAL); m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd)); diff --git a/src/mame/drivers/sun4.cpp b/src/mame/drivers/sun4.cpp index a4eaa3ccc7e..2be69f71d95 100644 --- a/src/mame/drivers/sun4.cpp +++ b/src/mame/drivers/sun4.cpp @@ -413,6 +413,7 @@ #include "bus/rs232/rs232.h" #include "bus/sunkbd/sunkbd.h" +#include "bus/sunmouse/sunmouse.h" #include "bus/sbus/sbus.h" #include "bus/sbus/bwtwo.h" #include "cpu/sparc/sparc.h" @@ -442,6 +443,7 @@ #define SCC1_TAG "scc1" #define SCC2_TAG "scc2" #define KEYBOARD_TAG "keyboard" +#define MOUSE_TAG "mouseport" #define RS232A_TAG "rs232a" #define RS232B_TAG "rs232b" #define FDC_TAG "fdc" @@ -490,6 +492,13 @@ #define DMA_BYTE_COUNT (2) #define DMA_XTAL (25_MHz_XTAL) +#define AUXIO_DENSITY (0x20) +#define AUXIO_DISK_CHG (0x10) +#define AUXIO_DRIVE_SEL (0x08) +#define AUXIO_TC (0x04) +#define AUXIO_EJECT (0x02) +#define AUXIO_LED (0x01) + namespace { const sparc_disassembler::asi_desc_map::value_type sun4_asi_desc[] = { @@ -542,6 +551,7 @@ public: , m_scc1(*this, SCC1_TAG) , m_scc2(*this, SCC2_TAG) , m_fdc(*this, FDC_TAG) + , m_floppy(*this, FDC_TAG":0") , m_lance(*this, LANCE_TAG) , m_scsibus(*this, "scsibus") , m_scsi(*this, "scsibus:7:ncr53c90a") @@ -579,6 +589,8 @@ private: DECLARE_WRITE32_MEMBER( sun4c_mmu_w ); DECLARE_READ32_MEMBER( ram_r ); DECLARE_WRITE32_MEMBER( ram_w ); + DECLARE_READ32_MEMBER( timeout_r ); + DECLARE_WRITE32_MEMBER( timeout_w ); DECLARE_READ32_MEMBER( ss1_sl0_id ); DECLARE_READ32_MEMBER( timer_r ); DECLARE_WRITE32_MEMBER( timer_w ); @@ -586,6 +598,8 @@ private: DECLARE_WRITE8_MEMBER( irq_w ); DECLARE_READ8_MEMBER( fdc_r ); DECLARE_WRITE8_MEMBER( fdc_w ); + DECLARE_READ8_MEMBER( auxio_r ); + DECLARE_WRITE8_MEMBER( auxio_w ); DECLARE_READ32_MEMBER( dma_r ); DECLARE_WRITE32_MEMBER( dma_w ); DECLARE_READ32_MEMBER( lance_dma_r ); // TODO: Should be 16 bits @@ -598,6 +612,8 @@ private: DECLARE_WRITE_LINE_MEMBER( scc1_int ); DECLARE_WRITE_LINE_MEMBER( scc2_int ); + DECLARE_WRITE_LINE_MEMBER( fdc_irq ); + DECLARE_FLOPPY_FORMATS( floppy_formats ); void ncr53c90a(device_t *device); @@ -622,7 +638,8 @@ private: required_device<z80scc_device> m_scc1; required_device<z80scc_device> m_scc2; - required_device<n82077aa_device> m_fdc; + required_device<i82072_device> m_fdc; + required_device<floppy_connector> m_floppy; required_device<am79c90_device> m_lance; required_device<nscsi_bus_device> m_scsibus; required_device<ncr53c90a_device> m_scsi; @@ -636,6 +653,7 @@ private: uint32_t *m_rom_ptr; uint32_t m_context; uint8_t m_system_enable; + uint8_t m_auxio; uint32_t m_buserr[4]; uint32_t m_counter[4]; uint32_t m_dma[4]; @@ -643,13 +661,15 @@ private: bool m_dma_tc_read; uint32_t m_dma_pack_register; int m_scsi_irq; + int m_fdc_irq; uint32_t *m_ram_ptr; uint8_t m_segmap[16][4096]; uint32_t m_pagemap[16384]; uint32_t m_cachetags[0x4000]; uint32_t m_cachedata[0x4000]; - uint32_t m_ram_size, m_ram_size_words; + uint32_t m_ram_size; + uint32_t m_ram_size_words; uint8_t m_ctx_mask; // SS2 is sun4c but has 16 contexts; most have 8 uint8_t m_pmeg_mask; // SS2 is sun4c but has 16384 PTEs; most have 8192 uint8_t m_irq_reg; // IRQ control @@ -706,7 +726,7 @@ uint32_t sun4_state::read_insn_data_4c(uint8_t asi, address_space &space, uint32 return m_type1space->read32(space, tmp, mem_mask); default: - printf("sun4c: access to memory type not defined in sun4c\n"); + logerror("sun4c: access to memory type not defined in sun4c\n"); m_maincpu->set_mae(); m_buserr[0] = 0x20; m_buserr[1] = offset << 2; @@ -717,7 +737,7 @@ uint32_t sun4_state::read_insn_data_4c(uint8_t asi, address_space &space, uint32 { if (!machine().side_effects_disabled()) { - printf("sun4c: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc()); + logerror("sun4c: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc()); m_maincpu->set_mae(); m_buserr[0] |= 0x80; // invalid PTE m_buserr[0] &= ~0x8000; // read @@ -752,7 +772,7 @@ void sun4_state::write_insn_data_4c(uint8_t asi, address_space &space, uint32_t { if ((!(m_pagemap[entry] & PM_WRITEMASK)) || ((m_pagemap[entry] & PM_SYSMASK) && !(asi & 1))) { - printf("sun4c: write protect MMU error (PC=%x)\n", m_maincpu->pc()); + logerror("sun4c: write protect MMU error (PC=%x)\n", m_maincpu->pc()); m_buserr[0] |= 0x8040; // write, protection error m_buserr[1] = offset<<2; m_maincpu->set_mae(); @@ -777,7 +797,7 @@ void sun4_state::write_insn_data_4c(uint8_t asi, address_space &space, uint32_t m_type1space->write32(space, tmp, data, mem_mask); return; default: - printf("sun4c: access to memory type not defined\n"); + logerror("sun4c: access to memory type not defined\n"); m_maincpu->set_mae(); m_buserr[0] = 0x8020; m_buserr[1] = offset << 2; @@ -786,7 +806,7 @@ void sun4_state::write_insn_data_4c(uint8_t asi, address_space &space, uint32_t } else { - printf("sun4c: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc()); + logerror("sun4c: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc()); m_maincpu->set_mae(); m_buserr[0] |= 0x8080; // write cycle, invalid PTE m_buserr[1] = offset<<2; @@ -861,7 +881,7 @@ READ32_MEMBER( sun4_state::sun4c_mmu_r ) case 0: // IDPROM - TODO: SPARCstation-1 does not have an ID prom and a timeout should occur. default: - printf("sun4c: ASI 2 space unhandled read @ %x (PC=%x)\n", offset<<2, m_maincpu->pc()); + logerror("sun4c: ASI 2 space unhandled read @ %x (PC=%x)\n", offset<<2, m_maincpu->pc()); return 0; } break; @@ -894,11 +914,11 @@ READ32_MEMBER( sun4_state::sun4c_mmu_r ) return read_insn_data_4c(asi, space, offset, mem_mask); default: - if (!machine().side_effects_disabled()) printf("sun4c: ASI %d unhandled read @ %x (PC=%x)\n", asi, offset<<2, m_maincpu->pc()); + if (!machine().side_effects_disabled()) logerror("sun4c: ASI %d unhandled read @ %x (PC=%x)\n", asi, offset<<2, m_maincpu->pc()); return 0; } - printf("sun4c: read asi %d byte offset %x, PC = %x\n", asi, offset << 2, m_maincpu->pc()); + logerror("sun4c: read asi %d byte offset %x, PC = %x\n", asi, offset << 2, m_maincpu->pc()); return 0; } @@ -939,7 +959,7 @@ WRITE32_MEMBER( sun4_state::sun4c_mmu_w ) return; case 6: // bus error - printf("%08x to bus error @ %x, mask %08x\n", data, offset, mem_mask); + logerror("%08x to bus error @ %x, mask %08x\n", data, offset, mem_mask); m_buserr[offset & 0xf] = data; return; @@ -964,7 +984,7 @@ WRITE32_MEMBER( sun4_state::sun4c_mmu_w ) case 0: // IDPROM default: - printf("sun4c: ASI 2 space unhandled write %x @ %x (mask %08x, PC=%x, shift %x)\n", data, offset<<2, mem_mask, m_maincpu->pc(), offset>>26); + logerror("sun4c: ASI 2 space unhandled write %x @ %x (mask %08x, PC=%x, shift %x)\n", data, offset<<2, mem_mask, m_maincpu->pc(), offset>>26); return; } break; @@ -1003,7 +1023,7 @@ WRITE32_MEMBER( sun4_state::sun4c_mmu_w ) return; } - printf("sun4c: %08x to asi %d byte offset %x, PC = %x, mask = %08x\n", data, asi, offset << 2, m_maincpu->pc(), mem_mask); + logerror("sun4c: %08x to asi %d byte offset %x, PC = %x, mask = %08x\n", data, asi, offset << 2, m_maincpu->pc(), mem_mask); } // ----------------------------------------------------------------- @@ -1038,7 +1058,7 @@ uint32_t sun4_state::read_insn_data(uint8_t asi, address_space &space, uint32_t return m_type1space->read32(space, tmp, mem_mask); default: - printf("sun4: access to unhandled memory type\n"); + logerror("sun4: access to unhandled memory type\n"); return 0; } } @@ -1046,7 +1066,7 @@ uint32_t sun4_state::read_insn_data(uint8_t asi, address_space &space, uint32_t { if (!machine().side_effects_disabled()) { - printf("sun4: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc()); + logerror("sun4: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc()); m_maincpu->set_mae(); m_buserr[0] |= 0x80; // invalid PTE m_buserr[0] &= ~0x8000; // read @@ -1098,13 +1118,13 @@ void sun4_state::write_insn_data(uint8_t asi, address_space &space, uint32_t off return; default: - printf("sun4: access to memory type not defined in sun4c\n"); + logerror("sun4: access to memory type not defined in sun4c\n"); return; } } else { - printf("sun4: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc()); + logerror("sun4: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc()); //m_maincpu->trap(SPARC_DATA_ACCESS_EXCEPTION); //m_buserr[0] = 0x8; // invalid PTE //m_buserr[1] = offset<<2; @@ -1160,7 +1180,7 @@ READ32_MEMBER( sun4_state::sun4_mmu_r ) case 0: default: - printf("sun4: ASI 2 space unhandled read @ %x (PC=%x)\n", offset<<2, m_maincpu->pc()); + logerror("sun4: ASI 2 space unhandled read @ %x (PC=%x)\n", offset<<2, m_maincpu->pc()); return 0; } break; @@ -1196,11 +1216,11 @@ READ32_MEMBER( sun4_state::sun4_mmu_r ) return read_insn_data(asi, space, offset, mem_mask); default: - if (!machine().side_effects_disabled()) printf("sun4: ASI %d unhandled read @ %x (PC=%x)\n", asi, offset<<2, m_maincpu->pc()); + if (!machine().side_effects_disabled()) logerror("sun4: ASI %d unhandled read @ %x (PC=%x)\n", asi, offset<<2, m_maincpu->pc()); return 0; } - printf("sun4: read asi %d byte offset %x, PC = %x\n", asi, offset << 2, m_maincpu->pc()); + logerror("sun4: read asi %d byte offset %x, PC = %x\n", asi, offset << 2, m_maincpu->pc()); return 0; } @@ -1279,7 +1299,7 @@ WRITE32_MEMBER( sun4_state::sun4_mmu_w ) case 0: // IDPROM default: - printf("sun4: ASI 2 space unhandled write %x @ %x (mask %08x, PC=%x)\n", data, offset<<2, mem_mask, m_maincpu->pc()); + logerror("sun4: ASI 2 space unhandled write %x @ %x (mask %08x, PC=%x)\n", data, offset<<2, mem_mask, m_maincpu->pc()); return; } break; @@ -1395,9 +1415,11 @@ void sun4_state::machine_reset() { m_context = 0; m_system_enable = 0; + m_auxio = 0xc0; m_irq_reg = 0; m_scc1_int = m_scc2_int = 0; m_scsi_irq = 0; + m_fdc_irq = 0; m_dma_irq = false; m_dma_tc_read = false; m_dma_pack_register = 0; @@ -1433,6 +1455,21 @@ void sun4_state::machine_start() m_reset_timer->adjust(attotime::never); } +READ32_MEMBER( sun4_state::timeout_r ) +{ + m_buserr[0] = 0x20; // read timeout + m_buserr[1] = 0x04000000 + (offset << 2); + m_maincpu->set_mae(); + return ~0; +} + +WRITE32_MEMBER( sun4_state::timeout_w ) +{ + m_buserr[0] = 0x8020; // write timeout + m_buserr[1] = 0x04000000 + (offset << 2); + m_maincpu->set_mae(); +} + READ32_MEMBER( sun4_state::ram_r ) { //printf("ram_r: @ %08x (mask %08x)\n", offset<<2, mem_mask); @@ -1511,6 +1548,7 @@ WRITE32_MEMBER( sun4_state::ram_w ) void sun4_state::type0space_map(address_map &map) { map(0x00000000, 0x03ffffff).rw(FUNC(sun4_state::ram_r), FUNC(sun4_state::ram_w)); + map(0x04000000, 0x0fffffff).rw(FUNC(sun4_state::timeout_r), FUNC(sun4_state::timeout_w)); } void sun4_state::type1space_map(address_map &map) @@ -1522,6 +1560,7 @@ void sun4_state::type1space_map(address_map &map) map(0x05000000, 0x05000003).rw(FUNC(sun4_state::irq_r), FUNC(sun4_state::irq_w)); map(0x06000000, 0x0607ffff).rom().region("user1", 0); map(0x07200000, 0x07200003).rw(FUNC(sun4_state::fdc_r), FUNC(sun4_state::fdc_w)); + map(0x07400003, 0x07400003).rw(FUNC(sun4_state::auxio_r), FUNC(sun4_state::auxio_w)); map(0x08000000, 0x08000003).r(FUNC(sun4_state::ss1_sl0_id)); // slot 0 contains SCSI/DMA/Ethernet map(0x08400000, 0x0840000f).rw(FUNC(sun4_state::dma_r), FUNC(sun4_state::dma_w)); map(0x08800000, 0x0880002f).m(m_scsi, FUNC(ncr53c90a_device::map)).umask32(0xff000000); @@ -1549,11 +1588,9 @@ READ8_MEMBER( sun4_state::fdc_r ) { case 0: // Main Status (R) return m_fdc->msr_r(space, 0, 0xff); - break; case 1: // FIFO Data Port (R) return m_fdc->fifo_r(space, 0, 0xff); - break; default: break; @@ -1579,6 +1616,27 @@ WRITE8_MEMBER( sun4_state::fdc_w ) } } +READ8_MEMBER( sun4_state::auxio_r ) +{ + logerror("%s: auxio_r: %02x\n", machine().describe_context(), m_auxio); + return m_auxio; +} + +WRITE8_MEMBER( sun4_state::auxio_w ) +{ + logerror("%s: auxio_w: %02x, drive_sel:%d tc:%d eject:%d LED:%d\n", machine().describe_context(), data, BIT(data, 3), BIT(data, 2), BIT(data, 1), BIT(data, 0)); + m_auxio = (m_auxio & 0xf0) | (data & 0x0f); + if (!(m_auxio & AUXIO_DRIVE_SEL)) + { + m_auxio &= ~(AUXIO_DENSITY | AUXIO_DISK_CHG); + } + else + { + m_auxio |= AUXIO_DISK_CHG; // Report no disk inserted + m_fdc->tc_w(data & AUXIO_TC); + } +} + READ8_MEMBER( sun4_state::irq_r ) { return m_irq_reg; @@ -1586,18 +1644,45 @@ READ8_MEMBER( sun4_state::irq_r ) WRITE8_MEMBER( sun4_state::irq_w ) { - printf("%02x to IRQ\n", data); - + const uint8_t old_irq = m_irq_reg; m_irq_reg = data; + const uint8_t changed = old_irq ^ data; - m_maincpu->set_input_line(SPARC_IRQ12, ((m_scc1_int || m_scc2_int) && (m_irq_reg & 0x01)) ? ASSERT_LINE : CLEAR_LINE); - if (!(m_irq_reg & 0x01)) - m_maincpu->set_input_line(SPARC_NMI, CLEAR_LINE); + logerror("%02x to IRQ, %02x changed\n", data, changed); + + if (!changed) + return; + + if (BIT(changed, 0)) + { + if (BIT(m_irq_reg, 7) && BIT(m_counter[2] | m_counter[3], 31)) + m_maincpu->set_input_line(SPARC_IRQ14, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE); + if (BIT(m_irq_reg, 5) && BIT(m_counter[0] | m_counter[1], 31)) + m_maincpu->set_input_line(SPARC_IRQ10, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE); + if (BIT(m_irq_reg, 3)) + m_maincpu->set_input_line(SPARC_IRQ6, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE); + if (BIT(m_irq_reg, 2)) + m_maincpu->set_input_line(SPARC_IRQ4, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE); + if (BIT(m_irq_reg, 1)) + m_maincpu->set_input_line(SPARC_IRQ1, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE); + } + else if (BIT(m_irq_reg, 0)) + { + if (BIT(changed, 7) && BIT(m_counter[2] | m_counter[3], 31)) + m_maincpu->set_input_line(SPARC_IRQ14, BIT(m_irq_reg, 7) ? ASSERT_LINE : CLEAR_LINE); + if (BIT(changed, 5) && BIT(m_counter[0] | m_counter[1], 31)) + m_maincpu->set_input_line(SPARC_IRQ10, BIT(m_irq_reg, 5) ? ASSERT_LINE : CLEAR_LINE); + if (BIT(changed, 3)) + m_maincpu->set_input_line(SPARC_IRQ6, BIT(m_irq_reg, 3) ? ASSERT_LINE : CLEAR_LINE); + if (BIT(changed, 2)) + m_maincpu->set_input_line(SPARC_IRQ4, BIT(m_irq_reg, 2) ? ASSERT_LINE : CLEAR_LINE); + if (BIT(changed, 1)) + m_maincpu->set_input_line(SPARC_IRQ1, BIT(m_irq_reg, 1) ? ASSERT_LINE : CLEAR_LINE); + } } WRITE_LINE_MEMBER( sun4_state::scc1_int ) { - logerror("scc1\n"); m_scc1_int = state; m_maincpu->set_input_line(SPARC_IRQ12, ((m_scc1_int || m_scc2_int) && (m_irq_reg & 0x01)) ? ASSERT_LINE : CLEAR_LINE); @@ -1605,7 +1690,6 @@ WRITE_LINE_MEMBER( sun4_state::scc1_int ) WRITE_LINE_MEMBER( sun4_state::scc2_int ) { - logerror("scc2\n"); m_scc2_int = state; m_maincpu->set_input_line(SPARC_IRQ12, ((m_scc1_int || m_scc2_int) && (m_irq_reg & 0x01)) ? ASSERT_LINE : CLEAR_LINE); @@ -1623,7 +1707,6 @@ void sun4_state::device_timer(emu_timer &timer, device_timer_id id, int param, v start_timer(0); if ((m_irq_reg & 0x21) == 0x21) { - logerror("t0\n"); m_maincpu->set_input_line(SPARC_IRQ10, ASSERT_LINE); //printf("Taking INT10\n"); } @@ -1637,7 +1720,6 @@ void sun4_state::device_timer(emu_timer &timer, device_timer_id id, int param, v //m_c1_timer->adjust(attotime::never); if ((m_irq_reg & 0x81) == 0x81) { - logerror("t1\n"); m_maincpu->set_input_line(SPARC_IRQ14, ASSERT_LINE); //printf("Taking INT14\n"); } @@ -1646,7 +1728,7 @@ void sun4_state::device_timer(emu_timer &timer, device_timer_id id, int param, v case TIMER_RESET: m_reset_timer->adjust(attotime::never); m_maincpu->set_input_line(SPARC_RESET, CLEAR_LINE); - printf("Clearing reset line\n"); + //printf("Clearing reset line\n"); break; } } @@ -1665,7 +1747,6 @@ READ32_MEMBER( sun4_state::timer_r ) //printf("Read timer limit 0 (%08x) @ %x, mask %08x\n", ret, m_maincpu->pc(), mem_mask); m_counter[0] &= ~0x80000000; m_counter[1] &= ~0x80000000; - logerror("tc0\n"); m_maincpu->set_input_line(SPARC_IRQ10, CLEAR_LINE); } @@ -1678,7 +1759,6 @@ READ32_MEMBER( sun4_state::timer_r ) //printf("Read timer limit 1 (%08x) @ %x, mask %08x\n", ret, m_maincpu->pc(), mem_mask); m_counter[2] &= ~0x80000000; m_counter[3] &= ~0x80000000; - logerror("tc1\n"); m_maincpu->set_input_line(SPARC_IRQ14, CLEAR_LINE); } return ret; @@ -1947,6 +2027,17 @@ WRITE_LINE_MEMBER( sun4_state::scsi_drq ) } } +WRITE_LINE_MEMBER( sun4_state::fdc_irq ) +{ + int old_irq = m_fdc_irq; + m_fdc_irq = state; + if (old_irq != m_fdc_irq) + { + logerror("fdc_irq %d\n", state); + m_maincpu->set_input_line(SPARC_IRQ11, state ? ASSERT_LINE : CLEAR_LINE); + } +} + READ32_MEMBER( sun4_state::lance_dma_r ) { if (m_arch == ARCH_SUN4) @@ -2015,8 +2106,10 @@ MACHINE_CONFIG_START(sun4_state::sun4) M48T02(config, TIMEKEEPER_TAG, 0); - MCFG_N82077AA_ADD(FDC_TAG, n82077aa_device::MODE_PS2) - MCFG_FLOPPY_DRIVE_ADD("fdc:0", sun_floppies, "35hd", sun4_state::floppy_formats) + I82072(config, m_fdc, 24_MHz_XTAL); + m_fdc->set_ready_line_connected(false); + m_fdc->intrq_wr_callback().set(FUNC(sun4_state::fdc_irq)); + FLOPPY_CONNECTOR(config, m_floppy, sun_floppies, "35hd", sun4_state::floppy_formats); // MMU Type 0 device space ADDRESS_MAP_BANK(config, m_type0space).set_map(&sun4_state::type0space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); @@ -2033,8 +2126,10 @@ MACHINE_CONFIG_START(sun4_state::sun4) SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); m_scc1->out_int_callback().set(FUNC(sun4_state::scc1_int)); m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd)); + m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd)); SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type4hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w)); + SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w)); // RS232 serial ports SCC8530N(config, m_scc2, 4.9152_MHz_XTAL); @@ -2075,8 +2170,10 @@ MACHINE_CONFIG_START(sun4_state::sun4c) M48T02(config, TIMEKEEPER_TAG, 0); - MCFG_N82077AA_ADD(FDC_TAG, n82077aa_device::MODE_PS2) - MCFG_FLOPPY_DRIVE_ADD("fdc:0", sun_floppies, "35hd", sun4_state::floppy_formats) + I82072(config, m_fdc, 24_MHz_XTAL); + m_fdc->set_ready_line_connected(false); + m_fdc->intrq_wr_callback().set(FUNC(sun4_state::fdc_irq)); + FLOPPY_CONNECTOR(config, m_floppy, sun_floppies, "35hd", sun4_state::floppy_formats); // MMU Type 0 device space ADDRESS_MAP_BANK(config, m_type0space).set_map(&sun4_state::type0space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000); @@ -2093,8 +2190,10 @@ MACHINE_CONFIG_START(sun4_state::sun4c) SCC8530N(config, m_scc1, 4.9152_MHz_XTAL); m_scc1->out_int_callback().set(FUNC(sun4_state::scc1_int)); m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd)); + // no mouse TxD connection - replaced with soft power request input SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type5hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w)); + SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w)); // RS232 serial ports SCC8530N(config, m_scc2, 4.9152_MHz_XTAL); diff --git a/src/mame/drivers/sys9002.cpp b/src/mame/drivers/sys9002.cpp index 70c16c2e744..ce93ab675a7 100644 --- a/src/mame/drivers/sys9002.cpp +++ b/src/mame/drivers/sys9002.cpp @@ -66,11 +66,9 @@ void sys9002_state::sys9002_io(address_map &map) map.global_mask(0xff); //AM_RANGE(0x04, 0x04) AM_DEVREADWRITE("crtc", mc6845_device, status_r, address_w) // left commented out as mame freezes after about 2 seconds //AM_RANGE(0x05, 0x05) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w) - map(0x08, 0x08).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x09, 0x09).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); // 7 bits even parity, x64 + map(0x08, 0x09).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x11, 0x11).nopr(); // continuous read - map(0x1c, 0x1c).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x1d, 0x1d).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); // enabled for transmit only, 8 bits odd parity, x64 + map(0x1c, 0x1d).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); } /* Input ports */ @@ -151,7 +149,7 @@ MACHINE_CONFIG_START(sys9002_state::sys9002) uart_clock.signal_handler().append("uart2", FUNC(i8251_device::write_txc)); uart_clock.signal_handler().append("uart2", FUNC(i8251_device::write_rxc)); - i8251_device &uart1(I8251(config, "uart1", 0)); + i8251_device &uart1(I8251(config, "uart1", 0)); // 7 bits even parity, x64 uart1.txd_handler().set("rs232a", FUNC(rs232_port_device::write_txd)); uart1.dtr_handler().set("rs232a", FUNC(rs232_port_device::write_dtr)); uart1.rts_handler().set("rs232a", FUNC(rs232_port_device::write_rts)); @@ -162,7 +160,7 @@ MACHINE_CONFIG_START(sys9002_state::sys9002) MCFG_RS232_CTS_HANDLER(WRITELINE("uart1", i8251_device, write_cts)) MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS("terminal", uart1) - i8251_device &uart2(I8251(config, "uart2", 0)); + i8251_device &uart2(I8251(config, "uart2", 0)); // enabled for transmit only, 8 bits odd parity, x64 uart2.txd_handler().set("rs232b", FUNC(rs232_port_device::write_txd)); uart2.dtr_handler().set("rs232b", FUNC(rs232_port_device::write_dtr)); uart2.rts_handler().set("rs232b", FUNC(rs232_port_device::write_rts)); diff --git a/src/mame/drivers/taitogn.cpp b/src/mame/drivers/taitogn.cpp index ac8ce300943..b9077fd8ab0 100644 --- a/src/mame/drivers/taitogn.cpp +++ b/src/mame/drivers/taitogn.cpp @@ -381,11 +381,8 @@ public: void coh3002t_t1(machine_config &config); private: - DECLARE_WRITE_LINE_MEMBER(sio0_sck){ m_cat702[0]->write_clock(state); m_cat702[1]->write_clock(state); m_znmcu->write_clock(state); } - DECLARE_WRITE_LINE_MEMBER(sio0_txd){ m_cat702[0]->write_datain(state); m_cat702[1]->write_datain(state); } - DECLARE_WRITE_LINE_MEMBER(cat702_1_dataout){ m_cat702_dataout[0] = state; update_sio0_rxd(); } - DECLARE_WRITE_LINE_MEMBER(cat702_2_dataout){ m_cat702_dataout[1] = state; update_sio0_rxd(); } - DECLARE_WRITE_LINE_MEMBER(znmcu_dataout){ m_znmcu_dataout = state; update_sio0_rxd(); } + template<int Chip> DECLARE_WRITE_LINE_MEMBER(cat702_dataout) { m_cat702_dataout[Chip] = state; update_sio0_rxd(); } + DECLARE_WRITE_LINE_MEMBER(znmcu_dataout) { m_znmcu_dataout = state; update_sio0_rxd(); } void update_sio0_rxd() { m_sio0->write_rxd(m_cat702_dataout[0] && m_cat702_dataout[1] && m_znmcu_dataout); } DECLARE_READ8_MEMBER(control_r); DECLARE_WRITE8_MEMBER(control_w); @@ -692,27 +689,30 @@ void slot_ataflash(device_slot_interface &device) MACHINE_CONFIG_START(taitogn_state::coh3002t) /* basic machine hardware */ - MCFG_DEVICE_ADD( "maincpu", CXD8661R, XTAL(100'000'000) ) - MCFG_DEVICE_PROGRAM_MAP(taitogn_map) - - subdevice<ram_device>("maincpu:ram")->set_default_size("4M"); - - MCFG_DEVICE_MODIFY("maincpu:sio0") - MCFG_PSX_SIO_SCK_HANDLER(WRITELINE(*this, taitogn_state, sio0_sck)) - MCFG_PSX_SIO_TXD_HANDLER(WRITELINE(*this, taitogn_state, sio0_txd)) - - MCFG_DEVICE_ADD("cat702_1", CAT702, 0) - MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, taitogn_state, cat702_1_dataout)) - - MCFG_DEVICE_ADD("cat702_2", CAT702, 0) - MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, taitogn_state, cat702_2_dataout)) - - MCFG_DEVICE_ADD("znmcu", ZNMCU, 0) - MCFG_ZNMCU_DATAOUT_HANDLER(WRITELINE(*this, taitogn_state, znmcu_dataout)) - MCFG_ZNMCU_DSR_HANDLER(WRITELINE("maincpu:sio0", psxsio0_device, write_dsr)) - MCFG_ZNMCU_DSW_HANDLER(IOPORT("DSW")) - MCFG_ZNMCU_ANALOG1_HANDLER(IOPORT("ANALOG1")) - MCFG_ZNMCU_ANALOG2_HANDLER(IOPORT("ANALOG2")) + CXD8661R(config, m_maincpu, XTAL(100'000'000)); + m_maincpu->set_addrmap(AS_PROGRAM, &taitogn_state::taitogn_map); + + m_maincpu->subdevice<ram_device>("ram")->set_default_size("4M"); + + auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0")); + sio0.sck_handler().set(m_cat702[0], FUNC(cat702_device::write_clock)); + sio0.sck_handler().append(m_cat702[1], FUNC(cat702_device::write_clock)); + sio0.sck_handler().append(m_znmcu, FUNC(znmcu_device::write_clock)); + sio0.txd_handler().set(m_cat702[0], FUNC(cat702_device::write_datain)); + sio0.txd_handler().append(m_cat702[1], FUNC(cat702_device::write_datain)); + + CAT702(config, m_cat702[0], 0); + m_cat702[0]->dataout_handler().set(FUNC(taitogn_state::cat702_dataout<0>)); + + CAT702(config, m_cat702[1], 0); + m_cat702[1]->dataout_handler().set(FUNC(taitogn_state::cat702_dataout<1>)); + + ZNMCU(config, m_znmcu, 0); + m_znmcu->dataout_handler().set(FUNC(taitogn_state::znmcu_dataout)); + m_znmcu->dsr_handler().set("maincpu:sio0", FUNC(psxsio0_device::write_dsr)); + m_znmcu->dsw_handler().set_ioport("DSW"); + m_znmcu->analog1_handler().set_ioport("ANALOG1"); + m_znmcu->analog2_handler().set_ioport("ANALOG2"); MCFG_DEVICE_ADD("at28c16", AT28C16, 0) MCFG_DEVICE_ADD("rf5c296", RF5C296, 0) diff --git a/src/mame/drivers/tandy2k.cpp b/src/mame/drivers/tandy2k.cpp index 8f3a0a9d414..03b12ee5e0c 100644 --- a/src/mame/drivers/tandy2k.cpp +++ b/src/mame/drivers/tandy2k.cpp @@ -321,7 +321,7 @@ void tandy2k_state::tandy2k_io(address_map &map) map(0x00000, 0x00000).mirror(0x8).rw(FUNC(tandy2k_state::enable_r), FUNC(tandy2k_state::enable_w)); map(0x00002, 0x00002).mirror(0x8).w(FUNC(tandy2k_state::dma_mux_w)); map(0x00004, 0x00004).mirror(0x8).rw(FUNC(tandy2k_state::fldtc_r), FUNC(tandy2k_state::fldtc_w)); - map(0x00010, 0x00013).mirror(0xc).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)).umask16(0x00ff); + map(0x00010, 0x00013).mirror(0xc).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0x00030, 0x00033).mirror(0xc).m(m_fdc, FUNC(i8272a_device::map)).umask16(0x00ff); map(0x00040, 0x00047).mirror(0x8).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); map(0x00050, 0x00057).mirror(0x8).rw(m_i8255a, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); diff --git a/src/mame/drivers/tim100.cpp b/src/mame/drivers/tim100.cpp index de2e6397b74..f62678f26c3 100644 --- a/src/mame/drivers/tim100.cpp +++ b/src/mame/drivers/tim100.cpp @@ -59,10 +59,8 @@ void tim100_state::tim100_mem(address_map &map) map.unmap_value_high(); map(0x0000, 0x1fff).rom(); // 2764 at U16 map(0x2000, 0x27ff).ram().share("videoram"); // 2KB static ram CDM6116A at U15 - map(0x6000, 0x6000).rw("uart_u17", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x6001, 0x6001).rw("uart_u17", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x8000, 0x8000).rw("uart_u18", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x8001, 0x8001).rw("uart_u18", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x6000, 0x6001).rw("uart_u17", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x8000, 0x8001).rw("uart_u18", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0xa000, 0xa000).nopw(); // continuously writes 00 here map(0xc000, 0xc001).rw(m_crtc, FUNC(i8276_device::read), FUNC(i8276_device::write)); // i8276 } diff --git a/src/mame/drivers/trs80.cpp b/src/mame/drivers/trs80.cpp index ad7bf3fae89..adcd9636b6a 100644 --- a/src/mame/drivers/trs80.cpp +++ b/src/mame/drivers/trs80.cpp @@ -264,8 +264,7 @@ void trs80_state::radionic_mem(address_map &map) { m1_mem(map); // Optional external RS232 module with 8251 - //map(0x3400, 0x3400).mirror(0xfe).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - //map(0x3401, 0x3401).mirror(0xfe).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + //map(0x3400, 0x3401).mirror(0xfe).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); // Internal colour controls (need details) //map(0x3500, 0x35ff).w(FUNC(trs80_state::colour_w)); // Internal interface to external slots diff --git a/src/mame/drivers/tsispch.cpp b/src/mame/drivers/tsispch.cpp index e6d8fc853bc..a6fe540acc3 100644 --- a/src/mame/drivers/tsispch.cpp +++ b/src/mame/drivers/tsispch.cpp @@ -309,8 +309,7 @@ void tsispch_state::i8086_mem(address_map &map) { map.unmap_value_high(); map(0x00000, 0x02FFF).mirror(0x34000).ram(); // verified; 6264*2 sram, only first 3/4 used - map(0x03000, 0x03000).mirror(0x341FC).rw("i8251a_u15", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x03002, 0x03002).mirror(0x341FC).rw("i8251a_u15", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x03000, 0x03003).mirror(0x341FC).rw("i8251a_u15", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); map(0x03200, 0x03203).mirror(0x341FC).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); // AMD P8259 PIC @ U5 (reads as 04 and 7c, upper byte is open bus) map(0x03400, 0x03400).mirror(0x341FE).r(FUNC(tsispch_state::dsw_r)); // verified, read from dipswitch s4 map(0x03401, 0x03401).mirror(0x341FE).w(FUNC(tsispch_state::peripheral_w)); // verified, write to the 4 leds, plus 4 control bits diff --git a/src/mame/drivers/unior.cpp b/src/mame/drivers/unior.cpp index ac4c02df4ba..bcfc520f54c 100644 --- a/src/mame/drivers/unior.cpp +++ b/src/mame/drivers/unior.cpp @@ -110,8 +110,7 @@ void unior_state::unior_io(address_map &map) map(0x50, 0x50).w(FUNC(unior_state::scroll_w)); map(0x60, 0x61).rw("crtc", FUNC(i8275_device::read), FUNC(i8275_device::write)); map(0xdc, 0xdf).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); - map(0xec, 0xec).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0xed, 0xed).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0xec, 0xed).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); } /* Input ports */ diff --git a/src/mame/drivers/v100.cpp b/src/mame/drivers/v100.cpp index 7f4ba23e410..427f3c82504 100644 --- a/src/mame/drivers/v100.cpp +++ b/src/mame/drivers/v100.cpp @@ -218,10 +218,8 @@ void v100_state::io_map(address_map &map) map.global_mask(0xff); map(0x00, 0x0f).w(m_vtac, FUNC(crt5037_device::write)); map(0x10, 0x10).w("brg1", FUNC(com8116_device::stt_str_w)); - map(0x12, 0x12).rw("usart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x13, 0x13).rw("usart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x14, 0x14).rw("usart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x15, 0x15).rw("usart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x12, 0x13).rw("usart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x14, 0x15).rw("usart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x16, 0x16).w("brg2", FUNC(com8116_device::stt_str_w)); map(0x20, 0x20).r(FUNC(v100_state::earom_r)); map(0x30, 0x30).w(FUNC(v100_state::port30_w)); @@ -385,7 +383,7 @@ MACHINE_CONFIG_START(v100_state::v100) ppi.out_pc_callback().set(m_earom, FUNC(er1400_device::data_w)).bit(6).invert(); ppi.out_pc_callback().append(m_earom, FUNC(er1400_device::clock_w)).bit(0).invert(); - ER1400(config, m_earom, 0); + ER1400(config, m_earom); MACHINE_CONFIG_END diff --git a/src/mame/drivers/v102.cpp b/src/mame/drivers/v102.cpp index 210c1815ac6..36e02a821f5 100644 --- a/src/mame/drivers/v102.cpp +++ b/src/mame/drivers/v102.cpp @@ -63,8 +63,7 @@ void v102_state::io_map(address_map &map) //AM_RANGE(0x00, 0x3f) AM_DEVREADWRITE("vpac", crt9007_device, read, write) map(0x18, 0x19).nopw(); map(0x40, 0x43).rw("mpsc", FUNC(upd7201_new_device::ba_cd_r), FUNC(upd7201_new_device::ba_cd_w)); - map(0x60, 0x60).rw("usart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x61, 0x61).rw("usart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x60, 0x61).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x80, 0x83).w("pit", FUNC(pit8253_device::write)); map(0xa0, 0xa3).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); //AM_RANGE(0xbf, 0xbf) ??? diff --git a/src/mame/drivers/v1050.cpp b/src/mame/drivers/v1050.cpp index f90de13df63..d6ad0852bc8 100644 --- a/src/mame/drivers/v1050.cpp +++ b/src/mame/drivers/v1050.cpp @@ -336,7 +336,7 @@ READ8_MEMBER( v1050_state::kb_data_r ) READ8_MEMBER( v1050_state::kb_status_r ) { - uint8_t val = m_uart_kb->status_r(space, 0); + uint8_t val = m_uart_kb->status_r(); return val | (m_keyavail ? 0x02 : 0x00); } @@ -481,12 +481,10 @@ void v1050_state::v1050_io(address_map &map) map.unmap_value_high(); map.global_mask(0xff); map(0x84, 0x87).rw(m_ppi_disp, FUNC(i8255_device::read), FUNC(i8255_device::write)); -// AM_RANGE(0x88, 0x88) AM_DEVREADWRITE(I8251A_KB_TAG, i8251_device, data_r, data_w) -// AM_RANGE(0x89, 0x89) AM_DEVREADWRITE(I8251A_KB_TAG, i8251_device, status_r, control_w) +// map(0x88, 0x89).rw(m_uart_kb, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x88, 0x88).r(FUNC(v1050_state::kb_data_r)).w(m_uart_kb, FUNC(i8251_device::data_w)); map(0x89, 0x89).r(FUNC(v1050_state::kb_status_r)).w(m_uart_kb, FUNC(i8251_device::control_w)); - map(0x8c, 0x8c).rw(m_uart_sio, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x8d, 0x8d).rw(m_uart_sio, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x8c, 0x8d).rw(m_uart_sio, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x90, 0x93).rw(I8255A_MISC_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x94, 0x97).rw(m_fdc, FUNC(mb8877_device::read), FUNC(mb8877_device::write)); map(0x9c, 0x9f).rw(I8255A_RTC_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)); diff --git a/src/mame/drivers/v550.cpp b/src/mame/drivers/v550.cpp index eafbd292fbd..c8b9f504978 100644 --- a/src/mame/drivers/v550.cpp +++ b/src/mame/drivers/v550.cpp @@ -70,8 +70,7 @@ void v550_state::io_map(address_map &map) map(0x00, 0x01).rw("gdc", FUNC(upd7220_device::read), FUNC(upd7220_device::write)); map(0x10, 0x10).w("brg1", FUNC(com8116_device::stt_str_w)); map(0x20, 0x23).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0x30, 0x30).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x31, 0x31).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x30, 0x31).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x40, 0x40).rw("mpsc", FUNC(upd7201_new_device::da_r), FUNC(upd7201_new_device::da_w)); map(0x41, 0x41).rw("mpsc", FUNC(upd7201_new_device::ca_r), FUNC(upd7201_new_device::ca_w)); map(0x48, 0x48).rw("mpsc", FUNC(upd7201_new_device::db_r), FUNC(upd7201_new_device::db_w)); diff --git a/src/mame/drivers/vector4.cpp b/src/mame/drivers/vector4.cpp index e73108e1973..1d338f6b3c6 100644 --- a/src/mame/drivers/vector4.cpp +++ b/src/mame/drivers/vector4.cpp @@ -48,12 +48,9 @@ void vector4_state::vector4_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); - map(0x02, 0x02).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x03, 0x03).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x04, 0x04).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x05, 0x05).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x06, 0x06).rw("uart3", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x07, 0x07).rw("uart3", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x02, 0x03).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x04, 0x05).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x06, 0x07).rw("uart3", FUNC(i8251_device::read), FUNC(i8251_device::write)); } /* Input ports */ diff --git a/src/mame/drivers/vectrix.cpp b/src/mame/drivers/vectrix.cpp index dc1fdead34e..477fbb07386 100644 --- a/src/mame/drivers/vectrix.cpp +++ b/src/mame/drivers/vectrix.cpp @@ -44,8 +44,7 @@ void vectrix_state::mem_map(address_map &map) void vectrix_state::io_map(address_map &map) { - map(0x3000, 0x3000).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x3001, 0x3001).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x3000, 0x3001).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); } static INPUT_PORTS_START( vectrix ) diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index 977f50768d5..af84a06707b 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -191,6 +191,10 @@ public: virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; template<int Chip> DECLARE_READ8_MEMBER(segapcm_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(ym2608_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(ym2610_adpcm_a_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(ym2610_adpcm_b_rom_r); + template<int Chip> DECLARE_READ8_MEMBER(y8950_rom_r); template<int Chip> DECLARE_READ8_MEMBER(ymf278b_rom_r); template<int Chip> DECLARE_READ8_MEMBER(ymf271_rom_r); template<int Chip> DECLARE_READ8_MEMBER(ymz280b_rom_r); @@ -353,6 +357,15 @@ private: std::array<std::vector<uint8_t>, 0x40> m_data_streams; std::array<std::vector<data_block>, 0x40> m_data_stream_blocks; + struct + { + uint8_t cmp_type; + uint8_t cmp_sub_type; + uint8_t bit_dec; + uint8_t bit_cmp; + std::vector<uint8_t> entries; + } m_dec_table; + uint32_t m_ym2612_stream_offset = 0U; uint32_t m_multipcm_bank_l[2]; @@ -365,6 +378,7 @@ private: uint32_t m_okim6295_bank[2]; uint32_t m_okim6295_nmk112_bank[2][4]; + int m_sega32x_channel_hack; int m_nes_apu_channel_hack[2]; }; @@ -405,6 +419,10 @@ public: void soundchips16_map(address_map &map); template<int Chip> void segapcm_map(address_map &map); template<int Chip> void rf5c68_map(address_map &map); + template<int Chip> void ym2608_map(address_map &map); + template<int Chip> void ym2610_adpcm_a_map(address_map &map); + template<int Chip> void ym2610_adpcm_b_map(address_map &map); + template<int Chip> void y8950_map(address_map &map); template<int Chip> void ymf278b_map(address_map &map); template<int Chip> void ymf271_map(address_map &map); template<int Chip> void ymz280b_map(address_map &map); @@ -538,6 +556,7 @@ void vgmplay_device::device_reset() s.timer->enable(false); } + m_sega32x_channel_hack = 0; m_nes_apu_channel_hack[0] = 0; m_nes_apu_channel_hack[1] = 0; } @@ -624,6 +643,8 @@ void vgmplay_device::blocks_clear() m_data_streams[i].clear(); m_data_stream_blocks[i].clear(); } + + m_dec_table.entries.clear(); } uint32_t vgmplay_device::handle_data_block(uint32_t address) @@ -657,8 +678,10 @@ uint32_t vgmplay_device::handle_data_block(uint32_t address) uint8_t cmp_sub_type = m_file->read_byte(m_pc + 0x0e); uint16_t add_val = m_file->read_word(m_pc + 0x0f); - if (cmp_sub_type == 0x02) - osd_printf_error("unhandled n-bit compressed stream size %x->%x type %02x bit_dec %02x bit_cmp %02x unsupported cmp_sub_type %02x add_val %04x\n", size, out_size, type - 0x40, bit_dec, bit_cmp, cmp_sub_type, add_val); + if (cmp_sub_type == 0x02 && m_dec_table.entries.size() == 0) + osd_printf_error("invalid n-bit compressed stream, no decompression table\n"); + else if (cmp_sub_type == 0x02 && (m_dec_table.cmp_type != cmp_type || m_dec_table.cmp_sub_type != cmp_sub_type || m_dec_table.bit_dec != bit_dec || m_dec_table.bit_cmp != bit_cmp )) + osd_printf_error("invalid n-bit compressed stream, decompression table mismatch\n"); else { int in_pos = 0x11 - 0x07; @@ -705,8 +728,15 @@ uint32_t vgmplay_device::handle_data_block(uint32_t address) out_val = in_val + add_val; else if (cmp_sub_type == 1) out_val = (in_val << (bit_dec - bit_cmp)) + add_val; + else if (cmp_sub_type == 2) + { + if (bit_dec <= 8) + out_val = m_dec_table.entries[in_val]; + else if (bit_dec <= 16) + out_val = m_dec_table.entries[in_val << 1] | (m_dec_table.entries[(in_val << 1) + 1] << 8); + } else - osd_printf_error("unhandled n-bit compressed stream size %x->%x type %02x bit_dec %02x bit_cmp %02x unsupported cmp_sub_type %02x add_val %04x\n", size, out_size, type - 0x40, bit_dec, bit_cmp, cmp_sub_type, add_val); + osd_printf_error("invalid n-bit compressed stream size %x->%x type %02x bit_dec %02x bit_cmp %02x unsupported cmp_sub_type %02x add_val %04x\n", size, out_size, type - 0x40, bit_dec, bit_cmp, cmp_sub_type, add_val); for (int i = 0; i < bit_dec; i += 8) { @@ -726,9 +756,17 @@ uint32_t vgmplay_device::handle_data_block(uint32_t address) else osd_printf_error("unhandled unknown %02x compressed stream size %x->%x type %02x\n", cmp_type, size, out_size, type - 0x40); } - else if (type < 0x80) - osd_printf_error("unhandled compression table size %x\n", size); - + else if (type == 0x7f) + { + m_dec_table.cmp_type = m_file->read_byte(m_pc + 0x07); + m_dec_table.cmp_sub_type = m_file->read_byte(m_pc + 0x08); + m_dec_table.bit_dec = m_file->read_byte(m_pc + 0x09); + m_dec_table.bit_cmp = m_file->read_byte(m_pc + 0x0a); + + m_dec_table.entries.resize(m_file->read_word(m_pc + 0x0b) * ((m_dec_table.bit_dec + 7) / 8)); + for (size_t i = 0; i < m_dec_table.entries.size(); i++) + m_dec_table.entries[i] = m_file->read_byte(m_pc + 0x0d + i); + } else if (type < 0xc0) { uint32_t rom_size = m_file->read_dword(m_pc + 7); @@ -825,13 +863,33 @@ TIMER_CALLBACK_MEMBER(vgmplay_device::stream_timer_expired) else offset += s.position * s.step_size * s.byte_depth; - if (offset + s.byte_depth >= m_data_streams[s.bank].size()) + if (offset + s.byte_depth > m_data_streams[s.bank].size()) { - osd_printf_error("stream_timer_expired %02x: stream beyond end %u>=%u\n", param, offset, uint32_t(m_data_streams[s.bank].size())); + osd_printf_error("stream_timer_expired %02x: stream beyond end %d/%d %u>=%u\n", param, s.position, s.length, offset, uint32_t(m_data_streams[s.bank].size())); s.timer->enable(false); } + else if (s.chip_type == LED_YM2612) + { + m_io->write_byte(A_YM2612_0 + 0 + ((s.port & 1) << 1), s.reg); + m_io->write_byte(A_YM2612_0 + 1 + ((s.port & 1) << 1), m_data_streams[s.bank][offset]); + } + else if (s.chip_type == LED_YM2608) + { + m_io->write_byte(A_YM2608_0 + 0 + ((s.port & 1) << 1), s.reg); + m_io->write_byte(A_YM2608_0 + 1 + ((s.port & 1) << 1), m_data_streams[s.bank][offset]); + } else if (s.chip_type == LED_32X_PWM) + { + if (m_sega32x_channel_hack >= 0) + { + osd_printf_error("bad rip detected, enabling sega32x channels\n"); + m_io16->write_word(A_32X_PWM, 5); + + m_sega32x_channel_hack = -2; + } + m_io16->write_word(A_32X_PWM + (s.reg << 1), ((m_data_streams[s.bank][offset + 1] & 0xf) << 8) | m_data_streams[s.bank][offset]); + } else if (s.chip_type == LED_OKIM6258) m_io->write_byte(A_OKIM6258_0 + s.reg, m_data_streams[s.bank][offset]); else @@ -1380,10 +1438,24 @@ void vgmplay_device::execute_run() uint8_t offset = m_file->read_byte(m_pc + 1); uint8_t data = m_file->read_byte(m_pc + 2); - if ((offset & 0xf0) == 0 && data == 0) + if (m_sega32x_channel_hack >= 0) { - osd_printf_error("bad rip detected, enabling sega32x channels\n"); - data |= 5; + if ((offset & 0xf0) == 0) + { + if (data != 0) + m_sega32x_channel_hack = -1; + } + else + { + m_sega32x_channel_hack++; + if (m_sega32x_channel_hack == 32) + { + osd_printf_error("bad rip detected, enabling sega32x channels\n"); + m_io16->write_word(A_32X_PWM, 5); + + m_sega32x_channel_hack = -2; + } + } } m_io16->write_word(A_32X_PWM + ((offset & 0xf0) >> 3), ((offset & 0xf) << 8) | data); @@ -1431,11 +1503,11 @@ void vgmplay_device::execute_run() } } } - else if ((offset & 0x7f) == 0x15 && m_nes_apu_channel_hack[chip] == -2 && (m_file->read_byte(m_pc + 2) & 0x1f) != 0) - { - osd_printf_error("bad rip false positive, late enabling nesapu.%d channels\n", chip); - m_nes_apu_channel_hack[chip] = -1; - } + //else if ((offset & 0x7f) == 0x15 && m_nes_apu_channel_hack[chip] == -2 && (m_file->read_byte(m_pc + 2) & 0x1f) != 0) + //{ + // osd_printf_error("bad rip false positive, late enabling nesapu.%d channels %x/%x\n", chip, m_pc, m_io->read_dword(REG_SIZE)); + // m_nes_apu_channel_hack[chip] = -1; + //} if (offset & 0x80) m_io->write_byte(A_NESAPU_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); @@ -1963,7 +2035,7 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const "ymf278b.%d rom", "ymf271.%d rom", "ymz280b.%d rom", - "ymf278b.%d rom", + "ymf278b.%d ram", "y8950.%d delta-t rom", "multipcm.%d rom", "upd7759.%d rom", @@ -2008,7 +2080,7 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const } else if (type < 0x7f) util::stream_format(stream, "unknown%02x.%d stream comp. data-block %x", type - 0x40, second, size); - else if (type < 0x80) + else if (type == 0x7f) util::stream_format(stream, "decomp-table %x, %02x/%02x", size, opcodes.r8(pc + 7), opcodes.r8(pc + 8)); else if (type < 0x94) { @@ -2065,27 +2137,27 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const return 1 | SUPPORTED; case 0x90: - util::stream_format(stream, "stream control %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); + util::stream_format(stream, "stream control %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); return 5 | SUPPORTED; case 0x91: - util::stream_format(stream, "stream data %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); + util::stream_format(stream, "stream data %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); return 5 | SUPPORTED; case 0x92: - util::stream_format(stream, "stream frequency %02x %d\n", opcodes.r8(pc + 1), opcodes.r32(pc + 2)); + util::stream_format(stream, "stream frequency %02x %d", opcodes.r8(pc + 1), opcodes.r32(pc + 2)); return 6 | SUPPORTED; case 0x93: - util::stream_format(stream, "stream start %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4), opcodes.r8(pc + 5), opcodes.r8(pc + 6), opcodes.r8(pc + 7), opcodes.r8(pc + 8), opcodes.r8(pc + 9), opcodes.r8(pc + 10)); + util::stream_format(stream, "stream start %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4), opcodes.r8(pc + 5), opcodes.r8(pc + 6), opcodes.r8(pc + 7), opcodes.r8(pc + 8), opcodes.r8(pc + 9), opcodes.r8(pc + 10)); return 11 | SUPPORTED; case 0x94: - util::stream_format(stream, "stream stop %02x\n", opcodes.r8(pc + 1)); + util::stream_format(stream, "stream stop %02x", opcodes.r8(pc + 1)); return 2 | SUPPORTED; case 0x95: - util::stream_format(stream, "stream start short %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); + util::stream_format(stream, "stream start short %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); return 5 | SUPPORTED; case 0xa0: @@ -2308,6 +2380,24 @@ READ8_MEMBER(vgmplay_device::segapcm_rom_r) } template<int Chip> +READ8_MEMBER(vgmplay_device::ym2608_rom_r) +{ + return rom_r(Chip, 0x81, offset); +} + +template<int Chip> +READ8_MEMBER(vgmplay_device::ym2610_adpcm_a_rom_r) +{ + return rom_r(Chip, 0x82, offset); +} + +template<int Chip> +READ8_MEMBER(vgmplay_device::ym2610_adpcm_b_rom_r) +{ + return rom_r(Chip, 0x83, offset); +} + +template<int Chip> READ8_MEMBER(vgmplay_device::ymf278b_rom_r) { return rom_r(Chip, 0x84, offset); @@ -2326,6 +2416,12 @@ READ8_MEMBER(vgmplay_device::ymz280b_rom_r) } template<int Chip> +READ8_MEMBER(vgmplay_device::y8950_rom_r) +{ + return rom_r(Chip, 0x88, offset); +} + +template<int Chip> READ8_MEMBER(vgmplay_device::multipcm_rom_r) { if (m_multipcm_banked[Chip] == 1) @@ -3176,6 +3272,30 @@ void vgmplay_state::rf5c68_map(address_map &map) } template<int Chip> +void vgmplay_state::ym2608_map(address_map &map) +{ + map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::ym2608_rom_r<Chip>)); +} + +template<int Chip> +void vgmplay_state::ym2610_adpcm_a_map(address_map &map) +{ + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ym2610_adpcm_a_rom_r<Chip>)); +} + +template<int Chip> +void vgmplay_state::ym2610_adpcm_b_map(address_map &map) +{ + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ym2610_adpcm_b_rom_r<Chip>)); +} + +template<int Chip> +void vgmplay_state::y8950_map(address_map &map) +{ + map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::y8950_rom_r<Chip>)); +} + +template<int Chip> void vgmplay_state::ymf278b_map(address_map &map) { map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::ymf278b_rom_r<Chip>)); @@ -3360,21 +3480,27 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) // TODO: prevent error.log spew YM2608(config, m_ym2608[0], 0); + m_ym2608[0]->set_addrmap(0, &vgmplay_state::ym2608_map<0>); m_ym2608[0]->add_route(ALL_OUTPUTS, "lspeaker", 1); m_ym2608[0]->add_route(ALL_OUTPUTS, "rspeaker", 1); YM2608(config, m_ym2608[1], 0); + m_ym2608[1]->set_addrmap(0, &vgmplay_state::ym2608_map<1>); m_ym2608[1]->add_route(ALL_OUTPUTS, "lspeaker", 1); m_ym2608[1]->add_route(ALL_OUTPUTS, "rspeaker", 1); // TODO: prevent error.log spew YM2610(config, m_ym2610[0], 0); + m_ym2610[0]->set_addrmap(0, &vgmplay_state::ym2610_adpcm_a_map<0>); + m_ym2610[0]->set_addrmap(1, &vgmplay_state::ym2610_adpcm_b_map<0>); m_ym2610[0]->add_route(0, "lspeaker", 0.25); m_ym2610[0]->add_route(0, "rspeaker", 0.25); m_ym2610[0]->add_route(1, "lspeaker", 0.50); m_ym2610[0]->add_route(2, "rspeaker", 0.50); YM2610(config, m_ym2610[1], 0); + m_ym2610[1]->set_addrmap(0, &vgmplay_state::ym2610_adpcm_a_map<1>); + m_ym2610[1]->set_addrmap(1, &vgmplay_state::ym2610_adpcm_b_map<1>); m_ym2610[1]->add_route(0, "lspeaker", 0.25); m_ym2610[1]->add_route(0, "rspeaker", 0.25); m_ym2610[1]->add_route(1, "lspeaker", 0.50); @@ -3397,10 +3523,12 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) m_ym3526[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); Y8950(config, m_y8950[0], 0); + m_y8950[0]->set_addrmap(0, &vgmplay_state::y8950_map<0>); m_y8950[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.40); m_y8950[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.40); Y8950(config, m_y8950[1], 0); + m_y8950[1]->set_addrmap(0, &vgmplay_state::y8950_map<1>); m_y8950[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.40); m_y8950[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.40); @@ -3693,13 +3821,6 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) MACHINE_CONFIG_END ROM_START( vgmplay ) - // TODO: change sound cores to device_rom_interface - ROM_REGION( 0x80000, "ym2608.0", ROMREGION_ERASE00 ) - ROM_REGION( 0x80000, "ym2608.1", ROMREGION_ERASE00 ) - ROM_REGION( 0x80000, "ym2610.0", ROMREGION_ERASE00 ) - ROM_REGION( 0x80000, "ym2610.1", ROMREGION_ERASE00 ) - ROM_REGION( 0x80000, "y8950.0", ROMREGION_ERASE00 ) - ROM_REGION( 0x80000, "y8950.1", ROMREGION_ERASE00 ) // TODO: split up 32x to remove dependencies ROM_REGION( 0x4000, "master", ROMREGION_ERASE00 ) ROM_REGION( 0x4000, "slave", ROMREGION_ERASE00 ) diff --git a/src/mame/drivers/video21.cpp b/src/mame/drivers/video21.cpp index 5bece7ad699..c4c282d8318 100644 --- a/src/mame/drivers/video21.cpp +++ b/src/mame/drivers/video21.cpp @@ -19,7 +19,7 @@ To Do: - unknown status bits? eg. hopper - color overlay as seen on flyer upright cabinet -When booted, press W to get it going. +When booted, press Key out (mapped to W by default) to get it going. *******************************************************************************************/ @@ -132,8 +132,8 @@ static INPUT_PORTS_START( video21 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME("Stay") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_NAME("Payout") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_STAND ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_DIPNAME( 0x40, 0x40, "42b6" ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -221,4 +221,3 @@ ROM_START( video21 ) ROM_END GAME(1980, video21, 0, video21, video21, video21_state, empty_init, ROT0, "Video Games GmbH", "Video 21", MACHINE_NO_SOUND) - diff --git a/src/mame/drivers/vixen.cpp b/src/mame/drivers/vixen.cpp index 9751536838a..9f349bcae61 100644 --- a/src/mame/drivers/vixen.cpp +++ b/src/mame/drivers/vixen.cpp @@ -292,8 +292,7 @@ void vixen_state::vixen_io(address_map &map) map(0x18, 0x18).mirror(0x07).r(FUNC(vixen_state::ieee488_r)); map(0x20, 0x21).mirror(0x04).w(m_io_i8155, FUNC(i8155_device::ale_w)); map(0x28, 0x28).mirror(0x05).rw(m_io_i8155, FUNC(i8155_device::read), FUNC(i8155_device::write)); - map(0x30, 0x30).mirror(0x06).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x31, 0x31).mirror(0x06).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x30, 0x31).mirror(0x06).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x38, 0x38).mirror(0x07).r(FUNC(vixen_state::port3_r)); // AM_RANGE(0xf0, 0xff) Hard Disk? } diff --git a/src/mame/drivers/vk100.cpp b/src/mame/drivers/vk100.cpp index 3090162f4e1..0b9fa43acb5 100644 --- a/src/mame/drivers/vk100.cpp +++ b/src/mame/drivers/vk100.cpp @@ -749,15 +749,13 @@ void vk100_state::vk100_io(address_map &map) map(0x64, 0x67).mirror(0x80).w(FUNC(vk100_state::vgEX)); //EX MOV, DOT, VEC, ER map(0x68, 0x68).mirror(0x83).w(FUNC(vk100_state::KBDW)); //KBDW (probably AM_MIRROR(0x03)) map(0x6C, 0x6C).mirror(0x83).w(COM5016T_TAG, FUNC(com8116_device::stt_str_w)); //LD BAUD (baud rate clock divider setting for i8251 tx and rx clocks) (probably AM_MIRROR(0x03)) - map(0x70, 0x70).mirror(0x82).w(m_uart, FUNC(i8251_device::data_w)); //LD COMD (i8251 data reg) - map(0x71, 0x71).mirror(0x82).w(m_uart, FUNC(i8251_device::control_w)); //LD COM (i8251 control reg) + map(0x70, 0x71).mirror(0x82).w(m_uart, FUNC(i8251_device::write)); //LD COMD //AM_RANGE (0x74, 0x74) AM_MIRROR(0x83) AM_WRITE(unknown_74) //AM_RANGE (0x78, 0x78) AM_MIRROR(0x83) AM_WRITE(kbdw) //KBDW ?(mirror?) //AM_RANGE (0x7C, 0x7C) AM_MIRROR(0x83) AM_WRITE(unknown_7C) map(0x40, 0x47).mirror(0x80).r(FUNC(vk100_state::SYSTAT_A)); // SYSTAT A (state machine done and last 4 bits of vram, as well as dipswitches) map(0x48, 0x48).mirror(0x87/*0x80*/).r(FUNC(vk100_state::SYSTAT_B)); // SYSTAT B (uart stuff) - map(0x50, 0x50).mirror(0x86).r(m_uart, FUNC(i8251_device::data_r)); // UART O - map(0x51, 0x51).mirror(0x86).r(m_uart, FUNC(i8251_device::status_r)); // UAR + map(0x50, 0x51).mirror(0x86).r(m_uart, FUNC(i8251_device::read)); // UART O //AM_RANGE (0x58, 0x58) AM_MIRROR(0x87) AM_READ(unknown_58) //AM_RANGE (0x60, 0x60) AM_MIRROR(0x87) AM_READ(unknown_60) //AM_RANGE (0x68, 0x68) AM_MIRROR(0x87) AM_READ(unknown_68) // NOT USED diff --git a/src/mame/drivers/votrpss.cpp b/src/mame/drivers/votrpss.cpp index 29148b476b1..2406bf53c2d 100644 --- a/src/mame/drivers/votrpss.cpp +++ b/src/mame/drivers/votrpss.cpp @@ -136,8 +136,7 @@ void votrpss_state::votrpss_io(address_map &map) { map.global_mask(0xff); map(0x00, 0x03).mirror(0x3c).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0x40, 0x40).mirror(0x3e).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x41, 0x41).mirror(0x3e).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x40, 0x41).mirror(0x3e).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x80, 0x83).mirror(0x3c).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0xc0, 0xc0).mirror(0x3e).rw("ay", FUNC(ay8910_device::data_r), FUNC(ay8910_device::address_w)); map(0xc1, 0xc1).mirror(0x3e).rw("ay", FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w)); diff --git a/src/mame/drivers/vp122.cpp b/src/mame/drivers/vp122.cpp index 4f96e34bd76..704659218ec 100644 --- a/src/mame/drivers/vp122.cpp +++ b/src/mame/drivers/vp122.cpp @@ -61,8 +61,7 @@ void vp122_state::io_map(address_map &map) { map(0x00, 0x07).rw("avdc", FUNC(scn2674_device::read), FUNC(scn2674_device::write)); map(0x10, 0x1f).rw("duart", FUNC(scn2681_device::read), FUNC(scn2681_device::write)); - map(0x20, 0x20).rw("usart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x21, 0x21).rw("usart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x20, 0x21).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x50, 0x50).rw("avdc", FUNC(scn2674_device::buffer_r), FUNC(scn2674_device::buffer_w)); map(0x60, 0x60).rw("avdc", FUNC(scn2674_device::attr_buffer_r), FUNC(scn2674_device::attr_buffer_w)); map(0x70, 0x73).w("pit", FUNC(pit8253_device::write)); diff --git a/src/mame/drivers/vt100.cpp b/src/mame/drivers/vt100.cpp index d886f42c362..5d10f0d04f5 100644 --- a/src/mame/drivers/vt100.cpp +++ b/src/mame/drivers/vt100.cpp @@ -190,8 +190,7 @@ void vt100_state::vt100_io(address_map &map) map.unmap_value_high(); map.global_mask(0xff); // 0x00, 0x01 PUSART (Intel 8251) - map(0x00, 0x00).rw(m_pusart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x01, 0x01).rw(m_pusart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x00, 0x01).rw(m_pusart, FUNC(i8251_device::read), FUNC(i8251_device::write)); // 0x02 Baud rate generator map(0x02, 0x02).w("dbrg", FUNC(com8116_device::stt_str_w)); // 0x22 Modem buffer @@ -353,7 +352,7 @@ MACHINE_CONFIG_START(vt100_state::vt100) dbrg.fr_handler().set(m_pusart, FUNC(i8251_device::write_rxc)); dbrg.ft_handler().set(m_pusart, FUNC(i8251_device::write_txc)); - ER1400(config, m_nvr, 0); + ER1400(config, m_nvr); VT100_KEYBOARD(config, m_keyboard, 0).signal_out_callback().set(m_kbduart, FUNC(ay31015_device::write_si)); diff --git a/src/mame/drivers/xor100.cpp b/src/mame/drivers/xor100.cpp index 92e00a2856b..4fa4b8b013f 100644 --- a/src/mame/drivers/xor100.cpp +++ b/src/mame/drivers/xor100.cpp @@ -257,10 +257,8 @@ void xor100_state::xor100_mem(address_map &map) void xor100_state::xor100_io(address_map &map) { map.global_mask(0xff); - map(0x00, 0x00).rw(m_uart_a, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x01, 0x01).rw(m_uart_a, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x02, 0x02).rw(m_uart_b, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x03, 0x03).rw(m_uart_b, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x00, 0x01).rw(m_uart_a, FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x02, 0x03).rw(m_uart_b, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x04, 0x07).rw(I8255A_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x08, 0x08).w(FUNC(xor100_state::mmu_w)); map(0x09, 0x09).w(FUNC(xor100_state::prom_toggle_w)); diff --git a/src/mame/drivers/zn.cpp b/src/mame/drivers/zn.cpp index b6eb60e5b30..6a4a7d6f5d0 100644 --- a/src/mame/drivers/zn.cpp +++ b/src/mame/drivers/zn.cpp @@ -71,8 +71,7 @@ public: m_rombank(*this, "rombank%u", 1), m_soundbank(*this, "soundbank"), m_okibank(*this, "okibank"), - m_znmcu_dataout(1), - m_znmcu_dsrout(1) + m_znmcu_dataout(1) { std::fill(std::begin(m_cat702_dataout), std::end(m_cat702_dataout), 1); } @@ -80,6 +79,7 @@ public: void zn1_1mb_vram(machine_config &config); void zn1_2mb_vram(machine_config &config); void zn2(machine_config &config); + void gameboard_cat702(machine_config &config); void jdredd(machine_config &config); void coh1002msnd(machine_config &config); void coh1002tb(machine_config &config); @@ -110,13 +110,9 @@ public: DECLARE_CUSTOM_INPUT_MEMBER(jdredd_gun_mux_read); private: - DECLARE_WRITE_LINE_MEMBER(sio0_sck){ m_cat702[0]->write_clock(state); m_cat702[1]->write_clock(state); m_znmcu->write_clock(state); } - DECLARE_WRITE_LINE_MEMBER(sio0_txd){ m_cat702[0]->write_datain(state); m_cat702[1]->write_datain(state); } - template<int Chip> DECLARE_WRITE_LINE_MEMBER(cat702_dataout){ m_cat702_dataout[Chip] = state; update_sio0_rxd(); } - DECLARE_WRITE_LINE_MEMBER(znmcu_dataout){ m_znmcu_dataout = state; update_sio0_rxd(); } - DECLARE_WRITE_LINE_MEMBER(znmcu_dsrout){ m_znmcu_dsrout = state; update_sio0_dsr(); } - void update_sio0_rxd(){ m_sio0->write_rxd(m_cat702_dataout[0] && m_cat702_dataout[1] && m_znmcu_dataout); } - void update_sio0_dsr(){ m_sio0->write_dsr(m_znmcu_dsrout); } + template<int Chip> DECLARE_WRITE_LINE_MEMBER(cat702_dataout) { m_cat702_dataout[Chip] = state; update_sio0_rxd(); } + DECLARE_WRITE_LINE_MEMBER(znmcu_dataout) { m_znmcu_dataout = state; update_sio0_rxd(); } + void update_sio0_rxd() { m_sio0->write_rxd(m_cat702_dataout[0] && m_cat702_dataout[1] && m_znmcu_dataout); } DECLARE_READ8_MEMBER(znsecsel_r); DECLARE_WRITE8_MEMBER(znsecsel_w); DECLARE_READ8_MEMBER(boardconfig_r); @@ -221,7 +217,7 @@ private: required_device<psxgpu_device> m_gpu; required_device<screen_device> m_gpu_screen; required_device<psxsio0_device> m_sio0; - required_device_array<cat702_device, 2> m_cat702; + optional_device_array<cat702_device, 2> m_cat702; required_device<znmcu_device> m_znmcu; required_device<cpu_device> m_maincpu; optional_device<cpu_device> m_audiocpu; @@ -241,7 +237,6 @@ private: int m_cat702_dataout[2]; int m_znmcu_dataout; - int m_znmcu_dsrout; }; inline void ATTR_PRINTF(3,4) zn_state::verboselog( int n_level, const char *s_fmt, ... ) @@ -262,7 +257,6 @@ void zn_state::machine_start() save_item(NAME(m_n_znsecsel)); save_item(NAME(m_cat702_dataout)); save_item(NAME(m_znmcu_dataout)); - save_item(NAME(m_znmcu_dsrout)); } @@ -288,8 +282,8 @@ WRITE8_MEMBER(zn_state::znsecsel_w) { verboselog(2, "znsecsel_w( %08x, %08x, %08x )\n", offset, data, mem_mask ); - m_cat702[0]->write_select(BIT(data, 2)); - m_cat702[1]->write_select(BIT(data, 3)); + if (m_cat702[0]) m_cat702[0]->write_select(BIT(data, 2)); + if (m_cat702[1]) m_cat702[1]->write_select(BIT(data, 3)); m_znmcu->write_select((data & 0x8c) != 0x8c); // BIT(data,4); // read analogue controls? @@ -383,27 +377,25 @@ void zn_state::zn_map(address_map &map) MACHINE_CONFIG_START(zn_state::zn1_1mb_vram) /* basic machine hardware */ - MCFG_DEVICE_ADD( m_maincpu, CXD8530CQ, XTAL(67'737'600) ) - MCFG_DEVICE_PROGRAM_MAP( zn_map) + CXD8530CQ(config, m_maincpu, XTAL(67'737'600)); + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::zn_map); - subdevice<ram_device>("maincpu:ram")->set_default_size("4M"); + m_maincpu->subdevice<ram_device>("ram")->set_default_size("4M"); - MCFG_DEVICE_MODIFY("maincpu:sio0") - MCFG_PSX_SIO_SCK_HANDLER(WRITELINE(*this, zn_state, sio0_sck)) - MCFG_PSX_SIO_TXD_HANDLER(WRITELINE(*this, zn_state, sio0_txd)) + auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0")); + sio0.sck_handler().set(m_cat702[0], FUNC(cat702_device::write_clock)); + sio0.sck_handler().append(m_znmcu, FUNC(znmcu_device::write_clock)); + sio0.txd_handler().set(m_cat702[0], FUNC(cat702_device::write_datain)); - MCFG_DEVICE_ADD("cat702_1", CAT702, 0) - MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, zn_state, cat702_dataout<0>)) + CAT702(config, m_cat702[0], 0); + m_cat702[0]->dataout_handler().set(FUNC(zn_state::cat702_dataout<0>)); - MCFG_DEVICE_ADD("cat702_2", CAT702, 0) - MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, zn_state, cat702_dataout<1>)) - - MCFG_DEVICE_ADD("znmcu", ZNMCU, 0) - MCFG_ZNMCU_DATAOUT_HANDLER(WRITELINE(*this, zn_state, znmcu_dataout)) - MCFG_ZNMCU_DSR_HANDLER(WRITELINE(*this, zn_state, znmcu_dsrout)) - MCFG_ZNMCU_DSW_HANDLER(IOPORT("DSW")) - MCFG_ZNMCU_ANALOG1_HANDLER(IOPORT("ANALOG1")) - MCFG_ZNMCU_ANALOG2_HANDLER(IOPORT("ANALOG2")) + ZNMCU(config, m_znmcu, 0); + m_znmcu->dataout_handler().set(FUNC(zn_state::znmcu_dataout)); + m_znmcu->dsr_handler().set("maincpu:sio0", FUNC(psxsio0_device::write_dsr)); + m_znmcu->dsw_handler().set_ioport("DSW"); + m_znmcu->analog1_handler().set_ioport("ANALOG1"); + m_znmcu->analog2_handler().set_ioport("ANALOG2"); /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL(53'693'175) ) @@ -433,27 +425,25 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(zn_state::zn2) /* basic machine hardware */ - MCFG_DEVICE_ADD( m_maincpu, CXD8661R, XTAL(100'000'000) ) - MCFG_DEVICE_PROGRAM_MAP( zn_map) - - subdevice<ram_device>("maincpu:ram")->set_default_size("4M"); + CXD8661R(config, m_maincpu, XTAL(100'000'000)); + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::zn_map); - MCFG_DEVICE_MODIFY("maincpu:sio0") - MCFG_PSX_SIO_SCK_HANDLER(WRITELINE(*this, zn_state, sio0_sck)) - MCFG_PSX_SIO_TXD_HANDLER(WRITELINE(*this, zn_state, sio0_txd)) + m_maincpu->subdevice<ram_device>("ram")->set_default_size("4M"); - MCFG_DEVICE_ADD("cat702_1", CAT702, 0) - MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, zn_state, cat702_dataout<0>)) + auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0")); + sio0.sck_handler().set(m_cat702[0], FUNC(cat702_device::write_clock)); + sio0.sck_handler().append(m_znmcu, FUNC(znmcu_device::write_clock)); + sio0.txd_handler().set(m_cat702[0], FUNC(cat702_device::write_datain)); - MCFG_DEVICE_ADD("cat702_2", CAT702, 0) - MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, zn_state, cat702_dataout<1>)) + CAT702(config, m_cat702[0], 0); + m_cat702[0]->dataout_handler().set(FUNC(zn_state::cat702_dataout<0>)); - MCFG_DEVICE_ADD("znmcu", ZNMCU, 0) - MCFG_ZNMCU_DATAOUT_HANDLER(WRITELINE(*this, zn_state, znmcu_dataout)) - MCFG_ZNMCU_DSR_HANDLER(WRITELINE(*this, zn_state, znmcu_dsrout)) - MCFG_ZNMCU_DSW_HANDLER(IOPORT("DSW")) - MCFG_ZNMCU_ANALOG1_HANDLER(IOPORT("ANALOG1")) - MCFG_ZNMCU_ANALOG2_HANDLER(IOPORT("ANALOG2")) + ZNMCU(config, m_znmcu, 0); + m_znmcu->dataout_handler().set(FUNC(zn_state::znmcu_dataout)); + m_znmcu->dsr_handler().set("maincpu:sio0", FUNC(psxsio0_device::write_dsr)); + m_znmcu->dsw_handler().set_ioport("DSW"); + m_znmcu->analog1_handler().set_ioport("ANALOG1"); + m_znmcu->analog2_handler().set_ioport("ANALOG2"); /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8654Q, 0x200000, XTAL(53'693'175) ) @@ -474,6 +464,16 @@ MACHINE_CONFIG_START(zn_state::zn2) MCFG_DEVICE_ADD("at28c16", AT28C16, 0) MACHINE_CONFIG_END +void zn_state::gameboard_cat702(machine_config &config) +{ + auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0")); + sio0.sck_handler().append(m_cat702[1], FUNC(cat702_device::write_clock)); + sio0.txd_handler().append(m_cat702[1], FUNC(cat702_device::write_datain)); + + CAT702(config, m_cat702[1], 0); + m_cat702[1]->dataout_handler().set(FUNC(zn_state::cat702_dataout<1>)); +} + /* Capcom ZN1 generic PCB Layout ---------------------------- @@ -659,8 +659,9 @@ void zn_state::qsound_portmap(address_map &map) MACHINE_CONFIG_START(zn_state::coh1000c) zn1_1mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1000c_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000c_map); MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(8'000'000)) MCFG_DEVICE_PROGRAM_MAP(qsound_map) @@ -684,8 +685,9 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(zn_state::coh1002c) zn1_2mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1000c_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000c_map); MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(8'000'000)) MCFG_DEVICE_PROGRAM_MAP(qsound_map) @@ -845,8 +847,9 @@ Notes: MACHINE_CONFIG_START(zn_state::coh3002c) zn2(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1000c_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000c_map); MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(8'000'000)) MCFG_DEVICE_PROGRAM_MAP(qsound_map) @@ -1141,8 +1144,9 @@ void zn_state::fx1a_sound_map(address_map &map) MACHINE_CONFIG_START(zn_state::coh1000ta) zn1_1mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1000ta_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000ta_map); MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(16'000'000) / 4) /* 4 MHz */ MCFG_DEVICE_PROGRAM_MAP(fx1a_sound_map) @@ -1197,10 +1201,10 @@ void zn_state::init_coh1000tb() MACHINE_CONFIG_START(zn_state::coh1000tb) zn1_1mb_vram(config); + gameboard_cat702(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1000tb_map) + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000tb_map); MCFG_MACHINE_START_OVERRIDE(zn_state, coh1000ta) MCFG_MACHINE_RESET_OVERRIDE(zn_state, coh1000ta) @@ -1221,10 +1225,10 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(zn_state::coh1002tb) zn1_2mb_vram(config); + gameboard_cat702(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1000tb_map) + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000tb_map); MCFG_MACHINE_START_OVERRIDE(zn_state, coh1000ta) MCFG_MACHINE_RESET_OVERRIDE(zn_state, coh1000ta) @@ -1471,8 +1475,9 @@ void zn_state::coh1000w_map(address_map &map) MACHINE_CONFIG_START(zn_state::coh1000w) zn1_2mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1000w_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000w_map); subdevice<ram_device>("maincpu:ram")->set_default_size("8M"); @@ -1691,8 +1696,9 @@ void zn_state::oki_map(address_map &map) MACHINE_CONFIG_START(zn_state::coh1002e) zn1_2mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1002e_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1002e_map); MCFG_DEVICE_ADD(m_audiocpu, M68000, XTAL(12'000'000)) MCFG_DEVICE_PROGRAM_MAP(psarc_snd_map) @@ -1707,8 +1713,9 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(zn_state::beastrzrb) zn1_2mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1002e_map) + gameboard_cat702(config); // TODO: hook up bootleg protection + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1002e_map); MCFG_DEVICE_ADD(m_audiocpu, AT89C4051, XTAL(12'000'000)) // clock unverified MCFG_DEVICE_PROGRAM_MAP(beastrzrb_snd_map) @@ -1847,8 +1854,9 @@ MACHINE_RESET_MEMBER(zn_state,bam2) MACHINE_CONFIG_START(zn_state::bam2) zn1_2mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(bam2_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::bam2_map); MCFG_MACHINE_START_OVERRIDE(zn_state, bam2) MCFG_MACHINE_RESET_OVERRIDE(zn_state, bam2) @@ -2197,14 +2205,15 @@ void zn_state::jdredd_map(address_map &map) MACHINE_CONFIG_START(zn_state::coh1000a) zn1_2mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1000a_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000a_map); MACHINE_CONFIG_END MACHINE_CONFIG_START(zn_state::nbajamex) coh1000a(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(nbajamex_map) + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::nbajamex_map); NVRAM(config, "71256", nvram_device::DEFAULT_ALL_1); @@ -2218,8 +2227,8 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(zn_state::jdredd) coh1000a(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(jdredd_map) + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::jdredd_map); m_gpu_screen->screen_vblank().set(FUNC(zn_state::jdredd_vblank)); @@ -2385,8 +2394,9 @@ void zn_state::atlus_snd_map(address_map &map) MACHINE_CONFIG_START(zn_state::coh1001l) zn1_2mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1001l_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1001l_map); MCFG_DEVICE_ADD(m_audiocpu, M68000, XTAL(10'000'000)) MCFG_DEVICE_PROGRAM_MAP(atlus_snd_map) @@ -2441,8 +2451,9 @@ MACHINE_RESET_MEMBER(zn_state,coh1002v) MACHINE_CONFIG_START(zn_state::coh1002v) zn1_2mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1002v_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1002v_map); MCFG_MACHINE_START_OVERRIDE(zn_state, coh1002v) MCFG_MACHINE_RESET_OVERRIDE(zn_state, coh1002v) @@ -2631,8 +2642,9 @@ MACHINE_RESET_MEMBER(zn_state,coh1002m) MACHINE_CONFIG_START(zn_state::coh1002m) zn1_2mb_vram(config); - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1002m_map) + gameboard_cat702(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1002m_map); MCFG_MACHINE_START_OVERRIDE(zn_state, coh1002m) MCFG_MACHINE_RESET_OVERRIDE(zn_state, coh1002m) @@ -2688,8 +2700,7 @@ MACHINE_CONFIG_START(zn_state::coh1002msnd) coh1002m(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(coh1002msnd_map) + m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1002msnd_map); MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(32'000'000)/8) MCFG_DEVICE_PROGRAM_MAP(cbaj_z80_map) @@ -4944,10 +4955,13 @@ ROM_START( beastrzrb ) /* bootleg board */ /* http://www.atmel.com/dyn/products/product_card.asp?family_id=604&family_name=8051+Architecture&part_id=1939 */ ROM_LOAD( "at89c4051", 0x000000, 0x001000, NO_DUMP ) /* undumped internal ROM */ - ROM_REGION( 0x180000, "oki", 0 ) + ROM_REGION( 0x100000, "oki", 0 ) ROM_LOAD( "27c4096.1", 0x000000, 0x080000, CRC(217734a1) SHA1(de4f519215123c09b3b5f27509b4d74604b5e03d) ) ROM_LOAD( "27c4096.2", 0x080000, 0x080000, CRC(d1f2a9b2) SHA1(d1475a453ce4e3b9f2ff59abedf0f57ba3c408fe) ) - ROM_LOAD( "27c240.3", 0x100000, 0x080000, CRC(509cdc8b) SHA1(8b92b79be09de56e7d40c2d02fcbeca92bb60226) ) /* bad dump? (only contains 8k of data) */ + + // TODO: hook up bootleg protection + ROM_REGION16_LE( 0x080000, "blprot", 0 ) + ROM_LOAD( "27c240.3", 0x000000, 0x080000, CRC(509cdc8b) SHA1(8b92b79be09de56e7d40c2d02fcbeca92bb60226) ) // replay attack, upper & lower bytes identical ROM_REGION( 0x8, "cat702_2", 0 ) ROM_LOAD( "et02", 0x000000, 0x000008, CRC(187ce61a) SHA1(521122b0f7b3f278dd2a2b1d73c252b952b5f55d) ) diff --git a/src/mame/drivers/zorba.cpp b/src/mame/drivers/zorba.cpp index c51bb983378..74bce8a0af0 100644 --- a/src/mame/drivers/zorba.cpp +++ b/src/mame/drivers/zorba.cpp @@ -85,12 +85,9 @@ void zorba_state::zorba_io(address_map &map) map(0x04, 0x04).rw(FUNC(zorba_state::rom_r), FUNC(zorba_state::rom_w)); map(0x05, 0x05).rw(FUNC(zorba_state::ram_r), FUNC(zorba_state::ram_w)); map(0x10, 0x11).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); - map(0x20, 0x20).rw(m_uart0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x21, 0x21).rw(m_uart0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x22, 0x22).rw(m_uart1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x23, 0x23).rw(m_uart1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); - map(0x24, 0x24).rw(m_uart2, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); - map(0x25, 0x25).rw(m_uart2, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); + map(0x20, 0x21).rw(m_uart0, FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x22, 0x23).rw(m_uart1, FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x24, 0x25).rw(m_uart2, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x26, 0x26).w(FUNC(zorba_state::intmask_w)); map(0x30, 0x30).rw(m_dma, FUNC(z80dma_device::bus_r), FUNC(z80dma_device::bus_w)); map(0x40, 0x43).rw(m_fdc, FUNC(fd1793_device::read), FUNC(fd1793_device::write)); diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h index c907323c1c7..a4e4d6b3e77 100644 --- a/src/mame/includes/bbc.h +++ b/src/mame/includes/bbc.h @@ -75,6 +75,7 @@ public: m_intube(*this, "intube"), m_extube(*this, "extube"), m_1mhzbus(*this, "1mhzbus"), + m_userport(*this, "userport"), m_rtc(*this, "rtc"), m_fdc(*this, "fdc"), m_i8271(*this, "i8271"), @@ -168,12 +169,12 @@ public: TIMER_CALLBACK_MEMBER(bbc_tape_timer_cb); DECLARE_WRITE_LINE_MEMBER(write_acia_clock); DECLARE_WRITE_LINE_MEMBER(adlc_irq_w); - DECLARE_WRITE_LINE_MEMBER(econet_clk_w); DECLARE_WRITE_LINE_MEMBER(bus_nmi_w); DECLARE_WRITE8_MEMBER(bbcb_via_system_write_porta); DECLARE_WRITE8_MEMBER(bbcb_via_system_write_portb); DECLARE_READ8_MEMBER(bbcb_via_system_read_porta); DECLARE_READ8_MEMBER(bbcb_via_system_read_portb); + DECLARE_WRITE_LINE_MEMBER(lpstb_w); DECLARE_WRITE_LINE_MEMBER(bbc_hsync_changed); DECLARE_WRITE_LINE_MEMBER(bbc_vsync_changed); DECLARE_WRITE_LINE_MEMBER(bbc_de_changed); @@ -205,8 +206,8 @@ public: DECLARE_DEVICE_IMAGE_LOAD_MEMBER(exp4_load) { return bbc_load_rom(image, m_exp4); } image_init_result bbcm_load_cart(device_image_interface &image, generic_slot_device *slot); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_exp1_load) { return bbcm_load_cart(image, m_exp1); } - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_exp2_load) { return bbcm_load_cart(image, m_exp2); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_cart1_load) { return bbcm_load_cart(image, m_exp1); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_cart2_load) { return bbcm_load_cart(image, m_exp2); } MC6845_UPDATE_ROW(crtc_update_row); @@ -271,6 +272,7 @@ public: // HACK FOR MC6845 optional_device<bbc_tube_slot_device> m_intube; optional_device<bbc_tube_slot_device> m_extube; optional_device<bbc_1mhzbus_slot_device> m_1mhzbus; + optional_device<bbc_userport_slot_device> m_userport; optional_device<mc146818_device> m_rtc; optional_device<bbc_fdc_slot_device> m_fdc; optional_device<i8271_device> m_i8271; diff --git a/src/mame/includes/model1.h b/src/mame/includes/model1.h index f04d4b2843b..44a5b3c2504 100644 --- a/src/mame/includes/model1.h +++ b/src/mame/includes/model1.h @@ -103,8 +103,8 @@ public: private: // Machine - DECLARE_MACHINE_START(model1); - DECLARE_MACHINE_RESET(model1); + virtual void machine_start() override; + virtual void machine_reset() override; DECLARE_READ8_MEMBER(io_r); DECLARE_WRITE8_MEMBER(io_w); @@ -165,7 +165,7 @@ private: DECLARE_WRITE8_MEMBER(r360_w); // Rendering - DECLARE_VIDEO_START(model1); + virtual void video_start() override; DECLARE_READ16_MEMBER(model1_listctl_r); DECLARE_WRITE16_MEMBER(model1_listctl_w); diff --git a/src/mame/includes/nforcepc.h b/src/mame/includes/nforcepc.h new file mode 100644 index 00000000000..03e0d72e247 --- /dev/null +++ b/src/mame/includes/nforcepc.h @@ -0,0 +1,47 @@ +// license:BSD-3-Clause +// copyright-holders: Samuele Zannoli +#ifndef MAME_MACHINE_NFORCEPC_H +#define MAME_MACHINE_NFORCEPC_H + +#pragma once + +// NVIDIA Corporation nForce CPU bridge + +class crush11_host_device : public pci_host_device { +public: + template <typename T> + crush11_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, int ram_size) + : crush11_host_device(mconfig, tag, owner, clock) + { + set_ids_host(0x10de01a4, 0x01, 0x10430c11); + set_cpu_tag(std::forward<T>(cpu_tag)); + set_ram_size(ram_size); + } + crush11_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + template <typename T> void set_cpu_tag(T &&tag) { cpu.set_tag(std::forward<T>(tag)); } + void set_ram_size(int ram_size); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + + virtual void reset_all_mappings() override; + + virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override; + + virtual void config_map(address_map &map) override; + +private: + int ddr_ram_size; + required_device<device_memory_interface> cpu; + std::vector<uint32_t> ram; + + DECLARE_READ8_MEMBER(test_r); + DECLARE_WRITE8_MEMBER(test_w); +}; + +DECLARE_DEVICE_TYPE(CRUSH11, crush11_host_device) + +#endif diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp index cea8152afd2..6dbc57335a9 100644 --- a/src/mame/machine/bbc.cpp +++ b/src/mame/machine/bbc.cpp @@ -298,7 +298,7 @@ WRITE8_MEMBER(bbc_state::bbcm_acccon_w) } else { - space.install_read_handler(0xfc00, 0xfeff, read8_delegate(FUNC(bbc_state::bbcm_r),this)); + space.install_read_handler(0xfc00, 0xfeff, read8_delegate(FUNC(bbc_state::bbcm_r), this)); } } @@ -403,21 +403,22 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm7_w) READ8_MEMBER(bbc_state::bbcm_r) { - long myo; + uint8_t data = 0xff; + uint8_t myo; - if (offset<=0x0ff) /* FRED */ + switch (offset >> 8) { - return 0xff; - }; + case 0x00: /* FRED */ + if (m_1mhzbus) return m_1mhzbus->fred_r(space, offset & 0xff); + break; - if ((offset>=0x100) && (offset<=0x1ff)) /* JIM */ - { - return 0xff; - }; + case 0x01: /* JIM */ + if (m_1mhzbus) return m_1mhzbus->jim_r(space, offset & 0xff); + break; - if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */ - { - myo = offset-0x200; + case 0x02: /* SHEILA */ + data = 0xfe; + myo = offset & 0xff; if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) return m_hd6845->status_r(space, myo-0x00); /* Video controller */ if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) return m_hd6845->register_r(space, myo-0x01); if ((myo>=0x08) && (myo<=0x0f)) return m_acia ? m_acia->read(space, myo & 0x01) : 0xfe; /* Serial controller */ @@ -425,15 +426,11 @@ READ8_MEMBER(bbc_state::bbcm_r) if ((myo>=0x18) && (myo<=0x1f)) return m_upd7002 ? m_upd7002->read(space, myo-0x18) : 0xfe; /* A to D converter */ if ((myo>=0x20) && (myo<=0x23)) return 0xfe; /* VideoULA */ if ((myo>=0x24) && (myo<=0x27)) return bbcm_wd177xl_read(space, myo-0x24); /* 177x Control Latch */ - if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) return m_wd1770->read(myo-0x28); /* 1770 Controller */ - if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) return m_wd1772->read(myo-0x28); /* 1772 Controller */ - if ((myo>=0x28) && (myo<=0x2f)) return 0xfe; /* No Controller */ - if ((myo>=0x30) && (myo<=0x33)) return 0xfe; + if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) return m_wd1770->read(myo-0x28); /* 1770 Controller */ + if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) return m_wd1772->read(myo-0x28); /* 1772 Controller */ if ((myo>=0x34) && (myo<=0x37)) return bbcm_acccon_r(space, myo-0x34); /* ACCCON */ - if ((myo>=0x38) && (myo<=0x3f)) return 0xfe; /* NC ?? */ if ((myo>=0x40) && (myo<=0x5f)) return m_via6522_0->read(myo-0x40); if ((myo>=0x60) && (myo<=0x7f)) return m_via6522_1 ? m_via6522_1->read(myo-0x60) : 0xfe; - if ((myo>=0x80) && (myo<=0x9f)) return 0xfe; if ((myo>=0xa0) && (myo<=0xbf)) return m_adlc ? m_adlc->read(space, myo & 0x03) : 0xfe; if ((myo>=0xc0) && (myo<=0xdf)) return 0xff; if ((myo>=0xe0) && (myo<=0xff)) @@ -441,17 +438,27 @@ READ8_MEMBER(bbc_state::bbcm_r) if (m_intube && m_acccon_itu) return m_intube->host_r(space, myo-0xe0); /* Internal TUBE */ if (m_extube && !m_acccon_itu) return m_extube->host_r(space, myo-0xe0); /* External TUBE */ } + break; } - return 0xfe; + return data; } WRITE8_MEMBER(bbc_state::bbcm_w) { - long myo; + uint8_t myo; - if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */ + switch (offset >> 8) { - myo=offset-0x200; + case 0x00: /* FRED */ + if (m_1mhzbus) m_1mhzbus->fred_w(space, offset & 0xff, data); + break; + + case 0x01: /* JIM */ + if (m_1mhzbus) m_1mhzbus->jim_w(space, offset & 0xff, data); + break; + + case 0x02: /* SHEILA */ + myo = offset & 0xff; if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) m_hd6845->address_w(space, myo-0x00, data); /* Video Controller */ if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) m_hd6845->register_w(space, myo-0x01, data); if ((myo>=0x08) && (myo<=0x0f)) if (m_acia) m_acia->write(space, myo & 0x01, data); /* Serial controller */ @@ -459,22 +466,20 @@ WRITE8_MEMBER(bbc_state::bbcm_w) if ((myo>=0x18) && (myo<=0x1f) && (m_upd7002)) m_upd7002->write(space, myo-0x18, data); /* A to D converter */ if ((myo>=0x20) && (myo<=0x23)) bbc_videoULA_w(space, myo-0x20, data); /* VideoULA */ if ((myo>=0x24) && (myo<=0x27) && (m_wd1770)) bbcm_wd1770l_write(space, myo-0x24, data); /* disc control latch */ - if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) m_wd1770->write(myo-0x28, data); /* 1770 Controller */ + if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) m_wd1770->write(myo-0x28, data); /* 1770 Controller */ if ((myo>=0x24) && (myo<=0x27) && (m_wd1772)) bbcm_wd1772l_write(space, myo-0x24, data); /* disc control latch */ - if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) m_wd1772->write(myo-0x28, data); /* 1772 Controller */ + if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) m_wd1772->write(myo-0x28, data); /* 1772 Controller */ if ((myo>=0x30) && (myo<=0x33)) page_selectbm_w(space, myo-0x30, data); /* ROMSEL */ if ((myo>=0x34) && (myo<=0x37)) bbcm_acccon_w(space, myo-0x34, data); /* ACCCON */ - //if ((myo>=0x38) && (myo<=0x3f)) /* NC ?? */ if ((myo>=0x40) && (myo<=0x5f)) m_via6522_0->write(myo-0x40, data); if ((myo>=0x60) && (myo<=0x7f) && (m_via6522_1)) m_via6522_1->write(myo-0x60, data); - //if ((myo>=0x80) && (myo<=0x9f)) if ((myo>=0xa0) && (myo<=0xbf) && (m_adlc)) m_adlc->write(space, myo & 0x03, data); - //if ((myo>=0xc0) && (myo<=0xdf)) if ((myo>=0xe0) && (myo<=0xff)) { if (m_intube && m_acccon_itu) m_intube->host_w(space, myo-0xe0, data); /* Internal TUBE */ if (m_extube && !m_acccon_itu) m_extube->host_w(space, myo-0xe0, data); /* External TUBE */ } + break; } } @@ -952,6 +957,13 @@ READ8_MEMBER(bbc_state::bbcb_via_system_read_portb) } +WRITE_LINE_MEMBER(bbc_state::lpstb_w) +{ + m_via6522_0->write_cb2(state); + if (!state) + m_hd6845->assert_light_pen_input(); +} + /************************************** BBC Joystick Support **************************************/ @@ -1270,6 +1282,7 @@ WRITE_LINE_MEMBER(bbc_state::motor_w) con->get_device()->mon_w(!state); } } + m_i8271->ready_w(!state); } WRITE_LINE_MEMBER(bbc_state::side_w) @@ -1482,9 +1495,9 @@ image_init_result bbc_state::bbcm_load_cart(device_image_interface &image, gener return image_init_result::FAIL; } - slot->rom_alloc(size_lo + size_hi, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); - memcpy(slot->get_rom_base() + 0, image.get_software_region("uprom"), size_hi); - memcpy(slot->get_rom_base() + size_hi, image.get_software_region("lorom"), size_lo); + slot->rom_alloc(0x8000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + memcpy(slot->get_rom_base() + 0x0000, image.get_software_region("lorom"), size_lo); + memcpy(slot->get_rom_base() + 0x4000, image.get_software_region("uprom"), size_hi); } return image_init_result::PASS; diff --git a/src/mame/machine/cat702.h b/src/mame/machine/cat702.h index 4d25407e4a6..997c55bf241 100644 --- a/src/mame/machine/cat702.h +++ b/src/mame/machine/cat702.h @@ -10,16 +10,13 @@ DECLARE_DEVICE_TYPE(CAT702, cat702_device) -#define MCFG_CAT702_DATAOUT_HANDLER(_devcb) \ - downcast<cat702_device &>(*device).set_dataout_handler(DEVCB_##_devcb); - class cat702_device : public device_t { public: cat702_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // configuration helpers - template <class Object> devcb_base &set_dataout_handler(Object &&cb) { return m_dataout_handler.set_callback(std::forward<Object>(cb)); } + auto dataout_handler() { return m_dataout_handler.bind(); } DECLARE_WRITE_LINE_MEMBER(write_select); DECLARE_WRITE_LINE_MEMBER(write_datain); diff --git a/src/mame/machine/mbc55x.cpp b/src/mame/machine/mbc55x.cpp index dc4852e3568..fbed99ad7af 100644 --- a/src/mame/machine/mbc55x.cpp +++ b/src/mame/machine/mbc55x.cpp @@ -251,11 +251,11 @@ READ8_MEMBER(mbc55x_state::mbc55x_kb_usart_r) switch (offset) { case 0: //logerror("%s read kb_uart\n",machine().describe_context()); - result = m_kb_uart->data_r(space,0); + result = m_kb_uart->data_r(); break; case 1: - result = m_kb_uart->status_r(space,0); + result = m_kb_uart->status_r(); if (m_keyboard.key_special & KEY_BIT_CTRL) // Parity error used to flag control down result |= i8251_device::I8251_STATUS_PARITY_ERROR; break; @@ -270,8 +270,8 @@ WRITE8_MEMBER(mbc55x_state::mbc55x_kb_usart_w) switch (offset) { - case 0 : m_kb_uart->data_w(space, 0, data); break; - case 1 : m_kb_uart->control_w(space, 0, data); break; + case 0 : m_kb_uart->data_w(data); break; + case 1 : m_kb_uart->control_w(data); break; } } diff --git a/src/mame/machine/model1.cpp b/src/mame/machine/model1.cpp index c02b21d71ca..75eadf9a4d1 100644 --- a/src/mame/machine/model1.cpp +++ b/src/mame/machine/model1.cpp @@ -1723,7 +1723,7 @@ void model1_state::copro_hle_swa() } } -MACHINE_START_MEMBER(model1_state,model1) +void model1_state::machine_start() { m_digits.resolve(); m_copro_ram_data = std::make_unique<u32[]>(0x8000); diff --git a/src/mame/machine/model1io2.cpp b/src/mame/machine/model1io2.cpp index f1bac5e80bb..4c115d86bda 100644 --- a/src/mame/machine/model1io2.cpp +++ b/src/mame/machine/model1io2.cpp @@ -5,7 +5,7 @@ Sega Model 1 I/O Board (Advanced) Used by: - - Wing War (R360) (837-10859) + - Wing War/Wing War R360 (837-10859) - NetMerc (837-11659) - Virtua Cop (837-11130 with 837-11131) @@ -112,7 +112,7 @@ ioport_constructor model1io2_device::device_input_ports() const ROM_START( model1io2 ) ROM_REGION(0x10000, "iocpu", 0) - // Wing War (taken from R360 version, is it the same for the regular version?) + // Wing War/Wing War R360 ROM_SYSTEM_BIOS(0, "epr16891", "EPR-16891") ROMX_LOAD("epr-16891.6", 0x00000, 0x10000, CRC(a33f84d1) SHA1(3079397c7241c1a6f494fa310faff0989dfa04a0), ROM_BIOS(0)) diff --git a/src/mame/machine/pk8020.cpp b/src/mame/machine/pk8020.cpp index 74f6852501f..3e7131912ee 100644 --- a/src/mame/machine/pk8020.cpp +++ b/src/mame/machine/pk8020.cpp @@ -151,17 +151,9 @@ READ8_MEMBER(pk8020_state::devices_r) { case 0x00: return m_pit8253->read(space, offset & 3); case 0x08: return m_ppi8255_3->read(space,offset & 3); - case 0x10: switch(offset & 1) { - case 0 : return m_rs232->data_r(space,0); - case 1 : return m_rs232->status_r(space,0); - } - break; + case 0x10: return m_rs232->read(offset & 1); case 0x18: return m_wd1793->read(offset & 0x03); - case 0x20: switch(offset & 1) { - case 0 : return m_lan->data_r(space,0); - case 1 : return m_lan->status_r(space,0); - } - break; + case 0x20: return m_lan->read(offset & 1); case 0x28: return m_pic8259->read(space, offset & 1); case 0x30: return m_ppi8255_2->read(space,offset & 3); case 0x38: return m_ppi8255_1->read(space,offset & 3); @@ -175,19 +167,9 @@ WRITE8_MEMBER(pk8020_state::devices_w) { case 0x00: m_pit8253->write(space, offset & 3, data); break; case 0x08: m_ppi8255_3->write(space,offset & 3,data); break; - case 0x10: switch(offset & 1) { - case 0 : m_rs232->data_w(space,0,data); break; - case 1 : m_rs232->control_w(space,0,data); break; - } - break; - case 0x18: - m_wd1793->write(offset & 0x03, data); - break; - case 0x20: switch(offset & 1) { - case 0 : m_lan->data_w(space,0,data); break; - case 1 : m_lan->control_w(space,0,data); break; - } - break; + case 0x10: m_rs232->write(offset & 1, data); break; + case 0x18: m_wd1793->write(offset & 0x03, data); break; + case 0x20: m_lan->write(offset & 1, data); break; case 0x28: m_pic8259->write(space, offset & 1,data);break; case 0x30: m_ppi8255_2->write(space,offset & 3,data); break; case 0x38: m_ppi8255_1->write(space,offset & 3,data); break; diff --git a/src/mame/machine/pmd85.cpp b/src/mame/machine/pmd85.cpp index ca16cd117fa..1e446c06c3b 100644 --- a/src/mame/machine/pmd85.cpp +++ b/src/mame/machine/pmd85.cpp @@ -498,12 +498,7 @@ READ8_MEMBER(pmd85_state::pmd85_io_r) switch (offset & 0x70) { case 0x10: /* 8251 (casette recorder, V24) */ - switch (offset & 0x01) - { - case 0x00: return m_uart->data_r(space, offset & 0x01); - case 0x01: return m_uart->status_r(space, offset & 0x01); - } - break; + return m_uart->read(offset & 0x01); case 0x40: /* 8255 (GPIO/0, GPIO/1) */ return m_ppi8255_1->read(space, offset & 0x03); case 0x50: /* 8253 */ @@ -573,11 +568,7 @@ WRITE8_MEMBER(pmd85_state::pmd85_io_w) switch (offset & 0x70) { case 0x10: /* 8251 (casette recorder, V24) */ - switch (offset & 0x01) - { - case 0x00: m_uart->data_w(space, offset & 0x01, data); break; - case 0x01: m_uart->control_w(space, offset & 0x01, data); break; - } + m_uart->write(offset & 0x01, data); break; case 0x40: /* 8255 (GPIO/0, GPIO/0) */ m_ppi8255_1->write(space, offset & 0x03, data); diff --git a/src/mame/machine/znmcu.h b/src/mame/machine/znmcu.h index 5b8e3a88d94..4207cae2038 100644 --- a/src/mame/machine/znmcu.h +++ b/src/mame/machine/znmcu.h @@ -8,32 +8,17 @@ DECLARE_DEVICE_TYPE(ZNMCU, znmcu_device) -#define MCFG_ZNMCU_DATAOUT_HANDLER(_devcb) \ - downcast<znmcu_device &>(*device).set_dataout_handler(DEVCB_##_devcb); - -#define MCFG_ZNMCU_DSR_HANDLER(_devcb) \ - downcast<znmcu_device &>(*device).set_dsr_handler(DEVCB_##_devcb); - -#define MCFG_ZNMCU_DSW_HANDLER(_devcb) \ - downcast<znmcu_device &>(*device).set_dsw_handler(DEVCB_##_devcb); - -#define MCFG_ZNMCU_ANALOG1_HANDLER(_devcb) \ - downcast<znmcu_device &>(*device).set_analog1_handler(DEVCB_##_devcb); - -#define MCFG_ZNMCU_ANALOG2_HANDLER(_devcb) \ - downcast<znmcu_device &>(*device).set_analog2_handler(DEVCB_##_devcb); - class znmcu_device : public device_t { public: znmcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // configuration helpers - template <class Object> devcb_base &set_dsw_handler(Object &&cb) { return m_dsw_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_analog1_handler(Object &&cb) { return m_analog1_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_analog2_handler(Object &&cb) { return m_analog2_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_dataout_handler(Object &&cb) { return m_dataout_handler.set_callback(std::forward<Object>(cb)); } - template <class Object> devcb_base &set_dsr_handler(Object &&cb) { return m_dsr_handler.set_callback(std::forward<Object>(cb)); } + auto dsw_handler() { return m_dsw_handler.bind(); } + auto analog1_handler() { return m_analog1_handler.bind(); } + auto analog2_handler() { return m_analog2_handler.bind(); } + auto dataout_handler() { return m_dataout_handler.bind(); } + auto dsr_handler() { return m_dsr_handler.bind(); } WRITE_LINE_MEMBER(write_select); WRITE_LINE_MEMBER(write_clock); diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 68a9e121ade..e491810c73c 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -890,12 +890,12 @@ triothep // (c) 1989 Data East Corporation (World) triothepj // (c) 1989 Data East Corporation (Japan) @source:acvirus.cpp -virusa // (c) 1997 Access Gmbh -virusb // (c) 1999 Access Gmbh -virusc // (c) 2002 Access Gmbh -virusrck // (c) 2001 Access Gmbh -virusrckxl // (c) 2002 Access Gmbh -viruscl // (c) 2004 Access Gmbh +virusa // (c) 1997 Access GmbH +virusb // (c) 1999 Access GmbH +virusc // (c) 2002 Access GmbH +virusrck // (c) 2001 Access GmbH +virusrckxl // (c) 2002 Access GmbH +viruscl // (c) 2004 Access GmbH @source:adam.cpp adam // Coleco Adam @@ -38220,7 +38220,7 @@ victory // (c) 1982 vidbrain // @source:video21.cpp -video21 // Videogames gmbh 1980 +video21 // Videogames GmbH 1980 @source:videopin.cpp solarwar // 036154-036169 1979 [6502] diff --git a/src/mame/video/model1.cpp b/src/mame/video/model1.cpp index 2426dcbd3ae..9cf4db2c057 100644 --- a/src/mame/video/model1.cpp +++ b/src/mame/video/model1.cpp @@ -1562,7 +1562,7 @@ void model1_state::tgp_scan() m_render_done = 0; } -VIDEO_START_MEMBER(model1_state, model1) +void model1_state::video_start() { m_view = std::make_unique<model1_state::view_t>(); diff --git a/src/mame/video/pcd.cpp b/src/mame/video/pcd.cpp index 003ad8ca1b8..b6609505c8f 100644 --- a/src/mame/video/pcd.cpp +++ b/src/mame/video/pcd.cpp @@ -36,7 +36,6 @@ pcx_video_device::pcx_video_device(const machine_config &mconfig, const char *ta pcdx_video_device(mconfig, PCX_VIDEO, tag, owner, clock), device_serial_interface(mconfig, *this), m_crtc(*this, "crtc"), - m_vram(4*1024), m_charrom(*this, "char"), m_txd_handler(*this) { @@ -129,16 +128,22 @@ void pcx_video_device::pcx_vid_map(address_map &map) void pcx_video_device::pcx_vid_io(address_map &map) { - map(0x8000, 0x8007).rw("crtc", FUNC(scn2672_device::read), FUNC(scn2672_device::write)); + map(0x8000, 0x8007).rw(m_crtc, FUNC(scn2672_device::read), FUNC(scn2672_device::write)); map(0x8008, 0x8008).r(FUNC(pcx_video_device::unk_r)); - map(0xa000, 0xa001).rw(FUNC(pcx_video_device::vram_latch_r), FUNC(pcx_video_device::vram_latch_w)); + map(0xa000, 0xa000).rw(m_crtc, FUNC(scn2672_device::buffer_r), FUNC(scn2672_device::buffer_w)); + map(0xa001, 0xa001).rw(m_crtc, FUNC(scn2672_device::attr_buffer_r), FUNC(scn2672_device::attr_buffer_w)); map(0xa002, 0xa003).rw(FUNC(pcx_video_device::term_mcu_r), FUNC(pcx_video_device::term_mcu_w)); map(0xc000, 0xc7ff).ram(); } -void pcx_video_device::pcx_vram(address_map &map) +void pcx_video_device::pcx_char_ram(address_map &map) { - map(0x0000, 0x07ff).rw(FUNC(pcx_video_device::vram_r), FUNC(pcx_video_device::vram_w)); + map(0x0000, 0x07ff).ram(); +} + +void pcx_video_device::pcx_attr_ram(address_map &map) +{ + map(0x0000, 0x07ff).ram(); } MACHINE_CONFIG_START(pcx_video_device::device_add_mconfig) @@ -161,7 +166,8 @@ MACHINE_CONFIG_START(pcx_video_device::device_add_mconfig) m_crtc->set_character_width(12); m_crtc->set_display_callback(FUNC(pcx_video_device::display_pixels)); m_crtc->set_screen("screen"); - m_crtc->set_addrmap(0, &pcx_video_device::pcx_vram); + m_crtc->set_addrmap(0, &pcx_video_device::pcx_char_ram); + m_crtc->set_addrmap(1, &pcx_video_device::pcx_attr_ram); MACHINE_CONFIG_END @@ -211,19 +217,25 @@ SCN2674_DRAW_CHARACTER_MEMBER(pcd_video_device::display_pixels) SCN2672_DRAW_CHARACTER_MEMBER(pcx_video_device::display_pixels) { - uint8_t data; - address <<= 1; - data = m_charrom[m_vram[address] * 16 + linecount + (m_vram[address + 1] & 0x20 ? 4096 : 0)]; - if(cursor && blink) - data = 0xff; - if(m_p1 & 0x20) - data = ~data; - for(int i = 0; i < 8; i++) + uint16_t data = m_charrom[charcode * 16 + linecount + (attrcode & 0x20 ? 4096 : 0)]; + + if (cursor && blink) + data = 0x3ff; + else { - rgb_t pix = palette().pen(BIT(data, 7) ? 1 : 0); - bitmap.pix32(y, x++) = pix; - bitmap.pix32(y, x++) = pix; data <<= 1; + data |= data << 1; + } + + if (m_p1 & 0x20) + data ^= 0x3ff; + + for (int i = 0; i < 12; i++) + { + rgb_t pix = palette().pen(BIT(data, 10) ? 1 : 0); + bitmap.pix32(y, x++) = pix; + if (i != 1) + data <<= 1; } } @@ -365,31 +377,6 @@ WRITE8_MEMBER(pcx_video_device::term_mcu_w) } } -WRITE8_MEMBER(pcx_video_device::vram_w) -{ - offset <<= 1; - m_vram[offset] = m_vram_latch_w[0]; - m_vram[offset+1] = m_vram_latch_w[1]; -} - -READ8_MEMBER(pcx_video_device::vram_r) -{ - offset <<= 1; - m_vram_latch_r[0] = m_vram[offset]; - m_vram_latch_r[1] = m_vram[offset+1]; - return m_vram[offset]; -} - -WRITE8_MEMBER(pcx_video_device::vram_latch_w) -{ - m_vram_latch_w[offset] = data; -} - -READ8_MEMBER(pcx_video_device::vram_latch_r) -{ - return m_vram_latch_r[offset]; -} - READ8_MEMBER(pcdx_video_device::detect_r) { return 0; @@ -429,8 +416,8 @@ void pcd_video_device::device_reset() void pcd_video_device::map(address_map &map) { - map(0x00, 0x0f).w("crtc", FUNC(scn2674_device::write)).umask16(0x00ff); - map(0x00, 0x0f).r("crtc", FUNC(scn2674_device::read)).umask16(0xff00); + map(0x00, 0x0f).w(m_crtc, FUNC(scn2674_device::write)).umask16(0x00ff); + map(0x00, 0x0f).r(m_crtc, FUNC(scn2674_device::read)).umask16(0xff00); map(0x20, 0x20).w(FUNC(pcd_video_device::vram_sw_w)); map(0x30, 0x33).rw("graphics", FUNC(i8741_device::upi41_master_r), FUNC(i8741_device::upi41_master_w)).umask16(0x00ff); } diff --git a/src/mame/video/pcd.h b/src/mame/video/pcd.h index 1c92a66512b..22a28000616 100644 --- a/src/mame/video/pcd.h +++ b/src/mame/video/pcd.h @@ -93,16 +93,13 @@ public: DECLARE_WRITE8_MEMBER(term_w); DECLARE_READ8_MEMBER(term_mcu_r); DECLARE_WRITE8_MEMBER(term_mcu_w); - DECLARE_READ8_MEMBER(vram_r); - DECLARE_WRITE8_MEMBER(vram_w); - DECLARE_READ8_MEMBER(vram_latch_r); - DECLARE_WRITE8_MEMBER(vram_latch_w); DECLARE_READ8_MEMBER(unk_r); DECLARE_WRITE8_MEMBER(p1_w); void pcx_vid_io(address_map &map); void pcx_vid_map(address_map &map); - void pcx_vram(address_map &map); + void pcx_char_ram(address_map &map); + void pcx_attr_ram(address_map &map); protected: void device_start() override; void device_reset() override; @@ -115,10 +112,9 @@ protected: private: required_device<scn2672_device> m_crtc; - std::vector<uint8_t> m_vram; required_region_ptr<uint8_t> m_charrom; devcb_write_line m_txd_handler; - uint8_t m_term_key, m_term_char, m_term_stat, m_vram_latch_r[2], m_vram_latch_w[2], m_p1; + uint8_t m_term_key, m_term_char, m_term_stat, m_p1; DECLARE_READ8_MEMBER(rx_callback); DECLARE_WRITE8_MEMBER(tx_callback); diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index df5e2febea2..8191a2403be 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -780,7 +780,7 @@ int shaders::create_resources() vector_effect }; - for (int i = 0; i < 13; i++) + for (int i = 0; i < EFFECT_COUNT; i++) { effects[i]->add_uniform("SourceDims", uniform::UT_VEC2, uniform::CU_SOURCE_DIMS); effects[i]->add_uniform("TargetDims", uniform::UT_VEC2, uniform::CU_TARGET_DIMS); |