From abcd39913b8cbca046605ba94eb38fe370ee1e77 Mon Sep 17 00:00:00 2001 From: smf- Date: Wed, 29 May 2013 18:24:30 +0000 Subject: [PATCH] Added support for machine config fragments that are applied when the cart is loaded, converted NCR 53C7xx to devcb2 as an example [smf] --- src/emu/dislot.c | 13 ++++++++++ src/emu/dislot.h | 6 +++++ src/emu/machine/53c7xx.c | 52 ++++++++++++------------------------- src/emu/machine/53c7xx.h | 27 ++++++++++--------- src/emu/mconfig.c | 4 +++ src/mame/drivers/rastersp.c | 26 +++++++++---------- 6 files changed, 67 insertions(+), 61 deletions(-) diff --git a/src/emu/dislot.c b/src/emu/dislot.c index 74d6c80f1d8..8d61cc85c42 100644 --- a/src/emu/dislot.c +++ b/src/emu/dislot.c @@ -44,6 +44,11 @@ device_card_options *device_slot_interface::static_alloc_card_options(device_t & return options; } +void device_slot_interface::static_set_card_machine_config(device_t &device, const char *card, const machine_config_constructor machine_config) +{ + static_alloc_card_options(device, card)->m_machine_config = machine_config; +} + void device_slot_interface::static_set_card_device_input_defaults(device_t &device, const char *card, const input_device_default *input_device_defaults) { static_alloc_card_options(device, card)->m_input_device_defaults = input_device_defaults; @@ -59,6 +64,14 @@ void device_slot_interface::static_set_card_clock(device_t &device, const char * static_alloc_card_options(device, card)->m_clock = clock; } +const machine_config_constructor device_slot_interface::card_machine_config(const char *card) const +{ + device_card_options *options = m_card_options.find(card); + if (options != NULL) + return options->m_machine_config; + return NULL; +} + const input_device_default *device_slot_interface::card_input_device_defaults(const char *card) const { device_card_options *options = m_card_options.find(card); diff --git a/src/emu/dislot.h b/src/emu/dislot.h index 75e06d3915d..0fc93237e64 100644 --- a/src/emu/dislot.h +++ b/src/emu/dislot.h @@ -23,6 +23,9 @@ struct slot_interface #define MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_card, _fixed) \ device_slot_interface::static_set_slot_info(*device, SLOT_INTERFACE_NAME(_slot_intf), _def_card, _fixed); +#define MCFG_DEVICE_CARD_MACHINE_CONFIG(card, _machine_config_name) \ + device_slot_interface::static_set_card_machine_config(*device, card, MACHINE_CONFIG_NAME(_machine_config_name)); + #define MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS(card, _dev_inp_def) \ device_slot_interface::static_set_card_device_input_defaults(*device, card, DEVICE_INPUT_DEFAULTS_NAME(_dev_inp_def)); @@ -53,6 +56,7 @@ class device_card_options friend class simple_list; private: + machine_config_constructor m_machine_config; const input_device_default *m_input_device_defaults; const void *m_config; UINT32 m_clock; @@ -70,12 +74,14 @@ public: static void static_set_slot_info(device_t &device, const slot_interface *slots_info, const char *default_card,bool fixed); static device_card_options *static_alloc_card_options(device_t &device, const char *card); + static void static_set_card_machine_config(device_t &device, const char *card, const machine_config_constructor machine_config); static void static_set_card_device_input_defaults(device_t &device, const char *card, const input_device_default *default_input); static void static_set_card_config(device_t &device, const char *card, const void *config); static void static_set_card_clock(device_t &device, const char *card, UINT32 default_clock); const slot_interface* get_slot_interfaces() const { return m_slot_interfaces; }; const char * get_default_card() const { return m_default_card; }; virtual const char * get_default_card_software(const machine_config &config, emu_options &options) { return NULL; }; + const machine_config_constructor card_machine_config(const char *card) const; const input_device_default *card_input_device_defaults(const char *card) const; const void *card_config(const char *card) const; const UINT32 card_clock(const char *card) const; diff --git a/src/emu/machine/53c7xx.c b/src/emu/machine/53c7xx.c index 81f71cc4b58..d4e81ef41c3 100644 --- a/src/emu/machine/53c7xx.c +++ b/src/emu/machine/53c7xx.c @@ -59,7 +59,10 @@ const device_type NCR53C7XX = &device_creator; ncr53c7xx_device::ncr53c7xx_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : nscsi_device(mconfig, NCR53C7XX, "53C7xx SCSI", tag, owner, clock, "ncr537xx", __FILE__), device_execute_interface(mconfig, *this), - m_icount(0) + m_icount(0), + m_irq_handler(*this), + m_host_write(*this), + m_host_read(*this) { } @@ -74,7 +77,9 @@ void ncr53c7xx_device::device_start() m_icountptr = &m_icount; // resolve line callbacks - m_out_irq_func.resolve(m_out_irq_cb, *this); + m_irq_handler.resolve_safe(); + m_host_read.resolve_safe(0); + m_host_write.resolve_safe(); m_tm = timer_alloc(0); @@ -164,31 +169,7 @@ void ncr53c7xx_device::device_reset() set_scripts_state(SCRIPTS_IDLE); set_scsi_state(IDLE); - m_out_irq_func(CLEAR_LINE); -} - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void ncr53c7xx_device::device_config_complete() -{ - // inherit a copy of the static data - const NCR53C7XXinterface *intf = reinterpret_cast(static_config()); - - if (intf != NULL) - { - *static_cast(this) = *intf; - } - - // or initialize to defaults if none provided - else - { - memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb)); - } + m_irq_handler(CLEAR_LINE); } @@ -670,8 +651,7 @@ void ncr53c7xx_device::update_irqs() else m_istat &= ~ISTAT_DIP; - if (!m_out_irq_func.isnull()) - m_out_irq_func(m_istat ? ASSERT_LINE : CLEAR_LINE); + m_irq_handler(m_istat ? ASSERT_LINE : CLEAR_LINE); } //------------------------------------------------- @@ -718,7 +698,7 @@ void ncr53c7xx_device::send_byte() set_scsi_state( (m_scsi_state & STATE_MASK) | (SEND_WAIT_SETTLE << SUB_SHIFT) ); - UINT32 data = host_r(machine(), false, m_dnad & ~3); + UINT32 data = m_host_read(m_dnad & ~3, 0xffffffff); data = data >> ((m_dnad & 3) * 8) & 0xff; ++m_dnad; @@ -1078,7 +1058,7 @@ void ncr53c7xx_device::step(bool timeout) UINT32 shift = (8 * (m_dnad & 3)); UINT32 mem_mask = 0xff << shift; - host_w(machine(), false, m_dnad & ~3, data << shift, mem_mask); + m_host_write(m_dnad & ~3, data << shift, mem_mask); ++m_dnad; --m_dbc; @@ -1156,7 +1136,7 @@ void ncr53c7xx_device::execute_run() m_finished = false; // Fetch the instruction - UINT32 inst = host_r(machine(), false, m_dsp); + UINT32 inst = m_host_read(m_dsp, 0xffffffff); m_dcmd = inst >> 24; m_dbc = inst & 0xffffff; @@ -1239,7 +1219,7 @@ void ncr53c7xx_device::scripts_decode_bm(void) } } - m_dnad = host_r(machine(), false, m_dsp + 4); + m_dnad = m_host_read(m_dsp + 4, 0xffffffff); m_dsp += 8; } @@ -1317,7 +1297,7 @@ void ncr53c7xx_device::scripts_decode_io(void) } // Set some additional registers - m_dnad = m_dsps = host_r(machine(), false, m_dsp + 4); + m_dnad = m_dsps = m_host_read(m_dsp + 4, 0xffffffff); m_dsp += 8; } @@ -1352,7 +1332,7 @@ void ncr53c7xx_device::scripts_decode_tc(void) break; } - m_dnad = m_dsps = host_r(machine(), false, m_dsp + 4); + m_dnad = m_dsps = m_host_read(m_dsp + 4, 0xffffffff); m_dsp += 8; } @@ -1411,7 +1391,7 @@ void ncr53c7xx_device::bm_i_wmov() // Indirect addressing if (m_dcmd & (1 << 5)) - m_dnad = host_r(machine(), false, m_dnad); + m_dnad = m_host_read(m_dnad, 0xffffffff); // Compare the phase bits if ((scsi_bus->ctrl_r() & 7) == (m_dcmd & 7)) diff --git a/src/emu/machine/53c7xx.h b/src/emu/machine/53c7xx.h index 073028faa07..b812697d610 100644 --- a/src/emu/machine/53c7xx.h +++ b/src/emu/machine/53c7xx.h @@ -56,33 +56,35 @@ #define DSTAT_ABRT 0x10 #define DSTAT_DFE 0x80 +#define MCFG_NCR53C7XX_IRQ_HANDLER(_devcb) \ + devcb = &ncr53c7xx_device::set_irq_handler(*device, DEVCB2_##_devcb); -struct NCR53C7XXinterface -{ - devcb_write_line m_out_irq_cb; - UINT32 (*host_r)(running_machine &machine, bool io, offs_t addr); - void (*host_w)(running_machine &machine, bool io, offs_t addr, UINT32 data, UINT32 mem_mask); -}; +#define MCFG_NCR53C7XX_HOST_WRITE(_devcb) \ + devcb = &ncr53c7xx_device::set_host_write(*device, DEVCB2_##_devcb); +#define MCFG_NCR53C7XX_HOST_READ(_devcb) \ + devcb = &ncr53c7xx_device::set_host_read(*device, DEVCB2_##_devcb); class ncr53c7xx_device : public nscsi_device, - public device_execute_interface, - public NCR53C7XXinterface + public device_execute_interface { public: // construction/destruction ncr53c7xx_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + // static configuration helpers + template static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } + template static devcb2_base &set_host_write(device_t &device, _Object object) { return downcast(device).m_host_write.set_callback(object); } + template static devcb2_base &set_host_read(device_t &device, _Object object) { return downcast(device).m_host_read.set_callback(object); } + // our API DECLARE_READ32_MEMBER(read); DECLARE_WRITE32_MEMBER(write); - protected: // device-level overrides virtual void device_start(); virtual void device_reset(); - virtual void device_config_complete(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); virtual void execute_run(); @@ -215,8 +217,9 @@ private: void (ncr53c7xx_device::*m_scripts_op)(); // callbacks - devcb_resolved_write_line m_out_irq_func; - devcb_resolved_write_line m_out_drq_func; + devcb2_write_line m_irq_handler; + devcb2_write32 m_host_write; + devcb2_read32 m_host_read; }; // device type definition diff --git a/src/emu/mconfig.c b/src/emu/mconfig.c index d7bf8a4f5de..c70249bf60b 100644 --- a/src/emu/mconfig.c +++ b/src/emu/mconfig.c @@ -94,6 +94,10 @@ machine_config::machine_config(const game_driver &gamedrv, emu_options &options) device_t *new_dev = device_add(&owner, intf[i].name, intf[i].devtype, slot->card_clock(selval)); found = true; + machine_config_constructor additions = slot->card_machine_config(selval); + if (additions != NULL) + (*additions)(const_cast(*this), new_dev); + const input_device_default *input_device_defaults = slot->card_input_device_defaults(selval); if (input_device_defaults) { diff --git a/src/mame/drivers/rastersp.c b/src/mame/drivers/rastersp.c index a38be6c867f..e3d36b4b1b9 100644 --- a/src/mame/drivers/rastersp.c +++ b/src/mame/drivers/rastersp.c @@ -113,6 +113,8 @@ public: DECLARE_WRITE32_MEMBER(dsp_486_int_w); DECLARE_READ32_MEMBER(dsp_speedup_r); DECLARE_WRITE32_MEMBER(dsp_speedup_w); + DECLARE_READ32_MEMBER(ncr53c700_read); + DECLARE_WRITE32_MEMBER(ncr53c700_write); DECLARE_WRITE_LINE_MEMBER(scsi_irq); TIMER_DEVICE_CALLBACK_MEMBER(tms_timer1); @@ -831,24 +833,22 @@ INPUT_PORTS_END * *************************************/ -static UINT32 ncr53c700_r(running_machine &machine, bool io, offs_t addr) +READ32_MEMBER(rastersp_state::ncr53c700_read) { - rastersp_state *state = machine.driver_data(); - return state->m_maincpu->space(io ? AS_IO : AS_PROGRAM).read_dword(addr); + return m_maincpu->space(AS_PROGRAM).read_dword(offset, mem_mask); } -static void ncr53c700_w(running_machine &machine, bool io, offs_t addr, UINT32 data, UINT32 mem_mask) +WRITE32_MEMBER(rastersp_state::ncr53c700_write) { - rastersp_state *state = machine.driver_data(); - state->m_maincpu->space(io ? AS_IO : AS_PROGRAM).write_dword(addr, data, mem_mask); + m_maincpu->space(AS_PROGRAM).write_dword(offset, data, mem_mask); } -static const struct NCR53C7XXinterface ncr53c700_intf = -{ - DEVCB_DRIVER_LINE_MEMBER(rastersp_state, scsi_irq), - &ncr53c700_r, - &ncr53c700_w, -}; +static MACHINE_CONFIG_FRAGMENT( ncr53c700 ) + MCFG_DEVICE_MODIFY(DEVICE_SELF) + MCFG_NCR53C7XX_IRQ_HANDLER(DEVWRITELINE(":", rastersp_state, scsi_irq)) + MCFG_NCR53C7XX_HOST_READ(DEVREAD32(":", rastersp_state, ncr53c700_read)) + MCFG_NCR53C7XX_HOST_WRITE(DEVWRITE32(":", rastersp_state, ncr53c700_write)) +MACHINE_CONFIG_END static SLOT_INTERFACE_START( rastersp_scsi_devices ) SLOT_INTERFACE("harddisk", NSCSI_HARDDISK) @@ -895,8 +895,8 @@ static MACHINE_CONFIG_START( rastersp, rastersp_state ) MCFG_NSCSI_BUS_ADD("scsibus") MCFG_NSCSI_ADD("scsibus:0", rastersp_scsi_devices, "harddisk", true) MCFG_NSCSI_ADD("scsibus:7", rastersp_scsi_devices, "ncr53c700", true) - MCFG_DEVICE_CARD_CONFIG("ncr53c700", &ncr53c700_intf) MCFG_DEVICE_CARD_CLOCK("ncr53c700", 66000000) + MCFG_DEVICE_CARD_MACHINE_CONFIG("ncr53c700", ncr53c700) /* Video */ MCFG_SCREEN_ADD("screen", RASTER)