diff options
author | Ryan Holtz <therealmogminer@gmail.com> | 2018-05-22 15:53:52 +0200 |
---|---|---|
committer | Ryan Holtz <therealmogminer@gmail.com> | 2018-05-22 15:53:52 +0200 |
commit | 9abe0fb272a92cbc3f7be084af984146a3ca84d8 (patch) | |
tree | 2c61f2daa080d5d2b39cbea795600a6cbd084f32 /src/mame/machine | |
parent | b03df3659db994f5fe28652279a9bbc6099675fb (diff) |
cdi: Use device finders instead of machine().device, plus some driver_device cleanup. Could be improved further. (nw)
Diffstat (limited to 'src/mame/machine')
-rw-r--r-- | src/mame/machine/cdi070.cpp | 33 | ||||
-rw-r--r-- | src/mame/machine/cdi070.h | 6 | ||||
-rw-r--r-- | src/mame/machine/cdicdic.cpp | 86 | ||||
-rw-r--r-- | src/mame/machine/cdicdic.h | 11 | ||||
-rw-r--r-- | src/mame/machine/cdislave.cpp | 49 | ||||
-rw-r--r-- | src/mame/machine/cdislave.h | 12 |
6 files changed, 115 insertions, 82 deletions
diff --git a/src/mame/machine/cdi070.cpp b/src/mame/machine/cdi070.cpp index c7baa63b3b0..472075dd3c9 100644 --- a/src/mame/machine/cdi070.cpp +++ b/src/mame/machine/cdi070.cpp @@ -57,6 +57,7 @@ static inline void ATTR_PRINTF(3,4) verboselog(device_t& device, int n_level, co cdi68070_device::cdi68070_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, MACHINE_CDI68070, tag, owner, clock) + , m_maincpu(*this, finder_base::DUMMY_TAG) { } @@ -247,8 +248,6 @@ void cdi68070_device::set_quizard_mcu_value(uint16_t value) TIMER_CALLBACK_MEMBER( cdi68070_device::timer0_callback ) { - cdi_state *state = machine().driver_data<cdi_state>(); - m_timers.timer0 = m_timers.reload_register; m_timers.timer_status_register |= TSR_OV0; if(m_picr1 & 7) @@ -257,8 +256,8 @@ TIMER_CALLBACK_MEMBER( cdi68070_device::timer0_callback ) m_timers.timer_status_register |= TSR_OV0; if(interrupt) { - state->m_maincpu->set_input_line_vector(M68K_IRQ_1 + (interrupt - 1), 56 + interrupt); - state->m_maincpu->set_input_line(M68K_IRQ_1 + (interrupt - 1), ASSERT_LINE); + m_maincpu->set_input_line_vector(M68K_IRQ_1 + (interrupt - 1), 56 + interrupt); + m_maincpu->set_input_line(M68K_IRQ_1 + (interrupt - 1), ASSERT_LINE); } } @@ -320,8 +319,6 @@ void cdi68070_device::uart_tx(uint8_t data) TIMER_CALLBACK_MEMBER( cdi68070_device::rx_callback ) { - cdi_state *state = machine().driver_data<cdi_state>(); - if((m_uart.command_register & 3) == 1) { if(m_uart.receive_pointer >= 0) @@ -342,8 +339,8 @@ TIMER_CALLBACK_MEMBER( cdi68070_device::rx_callback ) uint8_t interrupt = (m_picr2 >> 4) & 7; if(interrupt) { - state->m_maincpu->set_input_line_vector(M68K_IRQ_1 + (interrupt - 1), 56 + interrupt); - state->m_maincpu->set_input_line(M68K_IRQ_1 + (interrupt - 1), ASSERT_LINE); + m_maincpu->set_input_line_vector(M68K_IRQ_1 + (interrupt - 1), 56 + interrupt); + m_maincpu->set_input_line(M68K_IRQ_1 + (interrupt - 1), ASSERT_LINE); } m_uart.status_register |= USR_RXRDY; @@ -532,15 +529,13 @@ void cdi68070_device::quizard_handle_byte_tx() TIMER_CALLBACK_MEMBER( cdi68070_device::tx_callback ) { - cdi_state *state = machine().driver_data<cdi_state>(); - if(((m_uart.command_register >> 2) & 3) == 1) { uint8_t interrupt = m_picr2 & 7; if(interrupt) { - state->m_maincpu->set_input_line_vector(M68K_IRQ_1 + (interrupt - 1), 56 + interrupt); - state->m_maincpu->set_input_line(M68K_IRQ_1 + (interrupt - 1), ASSERT_LINE); + m_maincpu->set_input_line_vector(M68K_IRQ_1 + (interrupt - 1), 56 + interrupt); + m_maincpu->set_input_line(M68K_IRQ_1 + (interrupt - 1), ASSERT_LINE); } if(m_uart.transmit_pointer > -1) @@ -573,8 +568,6 @@ TIMER_CALLBACK_MEMBER( cdi68070_device::tx_callback ) READ16_MEMBER( cdi68070_device::periphs_r ) { - cdi_state *state = machine().driver_data<cdi_state>(); - switch(offset) { // Interrupts: 80001001 @@ -637,12 +630,12 @@ READ16_MEMBER( cdi68070_device::periphs_r ) if((m_picr2 >> 4) & 7) { - state->m_maincpu->set_input_line(M68K_IRQ_1 + (((m_picr2 >> 4) & 7) - 1), ASSERT_LINE); + m_maincpu->set_input_line(M68K_IRQ_1 + (((m_picr2 >> 4) & 7) - 1), ASSERT_LINE); } if(m_picr2 & 7) { - state->m_maincpu->set_input_line(M68K_IRQ_1 + ((m_picr2 & 7) - 1), ASSERT_LINE); + m_maincpu->set_input_line(M68K_IRQ_1 + ((m_picr2 & 7) - 1), ASSERT_LINE); } return m_uart.status_register; @@ -688,7 +681,7 @@ READ16_MEMBER( cdi68070_device::periphs_r ) } if((m_picr2 >> 4) & 7) { - state->m_maincpu->set_input_line(M68K_IRQ_1 + (((m_picr2 >> 4) & 7) - 1), CLEAR_LINE); + m_maincpu->set_input_line(M68K_IRQ_1 + (((m_picr2 >> 4) & 7) - 1), CLEAR_LINE); } m_uart.receive_holding_register = m_uart.receive_buffer[0]; @@ -863,8 +856,7 @@ READ16_MEMBER( cdi68070_device::periphs_r ) WRITE16_MEMBER( cdi68070_device::periphs_w ) { - cdi_state *state = machine().driver_data<cdi_state>(); - + /* switch(offset) { // Interrupts: 80001001 @@ -995,7 +987,7 @@ WRITE16_MEMBER( cdi68070_device::periphs_w ) if(!m_timers.timer_status_register) { uint8_t interrupt = m_picr1 & 7; - state->m_maincpu->set_input_line(M68K_IRQ_1 + (interrupt - 1), CLEAR_LINE); + m_maincpu->set_input_line(M68K_IRQ_1 + (interrupt - 1), CLEAR_LINE); } } break; @@ -1170,6 +1162,7 @@ WRITE16_MEMBER( cdi68070_device::periphs_w ) verboselog(*this, 0, "cdi68070_periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); break; } + */ } #if ENABLE_UART_PRINTING diff --git a/src/mame/machine/cdi070.h b/src/mame/machine/cdi070.h index 0f1df7f7bad..74c962ba4aa 100644 --- a/src/mame/machine/cdi070.h +++ b/src/mame/machine/cdi070.h @@ -130,6 +130,9 @@ TODO: MCFG_DEVICE_ADD(_tag, MACHINE_CDI68070, 0) #define MCFG_CDI68070_REPLACE(_tag) \ MCFG_DEVICE_REPLACE(_tag, MACHINE_CDI68070, 0) +#define MCFG_CDI68070_CPU_TAG(_tag) \ + downcast<cdi68070_device &>(*device).set_cpu_tag(_tag); + //************************************************************************** // TYPE DEFINITIONS @@ -143,6 +146,8 @@ public: // construction/destruction cdi68070_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + void set_cpu_tag(const char *tag) { m_maincpu.set_tag(tag); } + // external callbacks void uart_rx(uint8_t data); void uart_tx(uint8_t data); @@ -270,6 +275,7 @@ protected: virtual void device_reset() override; private: + required_device<cpu_device> m_maincpu; void uart_rx_check(); void uart_tx_check(); diff --git a/src/mame/machine/cdicdic.cpp b/src/mame/machine/cdicdic.cpp index 7fb907504c4..c3d2756f5e5 100644 --- a/src/mame/machine/cdicdic.cpp +++ b/src/mame/machine/cdicdic.cpp @@ -28,7 +28,6 @@ TODO: #include "cpu/m68000/m68000.h" #include "cdrom.h" #include "sound/cdda.h" -#include "imagedev/chd_cd.h" // device type definition @@ -418,8 +417,6 @@ void cdicdic_device::decode_xa_stereo8(int32_t *cdic_xa_last, const uint8_t *xa, void cdicdic_device::decode_audio_sector(const uint8_t *xa, int32_t triggered) { // Get XA format from sector header - - cdi_state *state = machine().driver_data<cdi_state>(); const uint8_t *hdr = xa + 4; int32_t channels; int32_t bits = 4; @@ -481,8 +478,11 @@ void cdicdic_device::decode_audio_sector(const uint8_t *xa, int32_t triggered) fatalerror("play_xa: unhandled xa mode %08x\n",hdr[2]); } - dmadac_set_frequency(&state->m_dmadac[0], 2, m_audio_sample_freq); - dmadac_enable(&state->m_dmadac[0], 2, 1); + m_dmadac[0]->set_frequency(m_audio_sample_freq); + m_dmadac[0]->enable(1); + + m_dmadac[1]->set_frequency(m_audio_sample_freq); + m_dmadac[1]->enable(1); switch(channels) { @@ -529,7 +529,11 @@ void cdicdic_device::decode_audio_sector(const uint8_t *xa, int32_t triggered) break; } - dmadac_transfer(&state->m_dmadac[0], 2, 1, 2, 18*28*2*m_audio_sample_size, samples); + m_dmadac[0]->flush(); + m_dmadac[1]->flush(); + + m_dmadac[0]->transfer(0, 1, 2, 18*28*2*m_audio_sample_size, samples); + m_dmadac[1]->transfer(1, 1, 2, 18*28*2*m_audio_sample_size, samples); } // After an appropriate delay for decoding to take place... @@ -540,8 +544,6 @@ TIMER_CALLBACK_MEMBER( cdicdic_device::audio_sample_trigger ) void cdicdic_device::sample_trigger() { - cdi_state *state = machine().driver_data<cdi_state>(); - if(m_decode_addr == 0xffff) { verboselog(*this, 0, "%s", "Decode stop requested, stopping playback\n" ); @@ -557,8 +559,8 @@ void cdicdic_device::sample_trigger() // Set the CDIC interrupt line verboselog(*this, 0, "%s", "Setting CDIC interrupt line for soundmap decode\n" ); - state->m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); - state->m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); + m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); + m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); } else { @@ -601,8 +603,6 @@ TIMER_CALLBACK_MEMBER( cdicdic_device::trigger_readback_int ) void cdicdic_device::process_delayed_command() { - cdi_state *state = machine().driver_data<cdi_state>(); - switch(m_command) { case 0x23: // Reset Mode 1 @@ -712,8 +712,8 @@ void cdicdic_device::process_delayed_command() //printf( "Setting CDIC interrupt line\n" ); verboselog(*this, 0, "%s", "Setting CDIC interrupt line for audio sector\n" ); - state->m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); - state->m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); + m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); + m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); } else if((buffer[CDIC_SECTOR_SUBMODE2] & (CDIC_SUBMODE_DATA | CDIC_SUBMODE_AUDIO | CDIC_SUBMODE_VIDEO)) == 0x00) { @@ -731,8 +731,8 @@ void cdicdic_device::process_delayed_command() { //printf( "Setting CDIC interrupt line\n" ); verboselog(*this, 0, "%s", "Setting CDIC interrupt line for message sector\n" ); - state->m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); - state->m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); + m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); + m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); } else { @@ -751,8 +751,8 @@ void cdicdic_device::process_delayed_command() //printf( "Setting CDIC interrupt line\n" ); verboselog(*this, 0, "%s", "Setting CDIC interrupt line for data sector\n" ); - state->m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); - state->m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); + m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); + m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); } if((buffer[CDIC_SECTOR_SUBMODE2] & CDIC_SUBMODE_EOF) == 0 && m_command != 0x23) @@ -816,7 +816,7 @@ void cdicdic_device::process_delayed_command() // next_lba = next_nybbles[0] + next_nybbles[1]*10 + ((next_nybbles[2] + next_nybbles[3]*10)*75) + ((next_nybbles[4] + next_nybbles[5]*10)*75*60); verboselog(*this, 0, "Playing CDDA sector from MSF location %06x\n", m_time | 2 ); - state->m_cdda->start_audio(lba, rounded_next_msf); + m_cdda->start_audio(lba, rounded_next_msf); } m_ram[(m_data_buffer & 5) * (0xa00/2) + 0x924/2] = 0x0001; // CTRL @@ -846,8 +846,8 @@ void cdicdic_device::process_delayed_command() } verboselog(*this, 0, "%s", "Setting CDIC interrupt line for CDDA sector\n" ); - state->m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); - state->m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); + m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); + m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); break; } case 0x2c: // Seek @@ -897,8 +897,8 @@ void cdicdic_device::process_delayed_command() m_time = next_msf << 8; verboselog(*this, 0, "%s", "Setting CDIC interrupt line for Seek sector\n" ); - state->m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); - state->m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); + m_maincpu->set_input_line_vector(M68K_IRQ_4, 128); + m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); break; } } @@ -906,7 +906,6 @@ void cdicdic_device::process_delayed_command() READ16_MEMBER( cdicdic_device::regs_r ) { - cdi_state *state = machine().driver_data<cdi_state>(); uint32_t addr = offset + 0x3c00/2; switch(addr) @@ -945,7 +944,7 @@ READ16_MEMBER( cdicdic_device::regs_r ) m_audio_buffer &= 0x7fff; if(!((m_audio_buffer | m_x_buffer) & 0x8000)) { - state->m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE); + m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE); verboselog(*this, 0, "%s", "Clearing CDIC interrupt line\n" ); ////printf("Clearing CDIC interrupt line\n" ); } @@ -959,7 +958,7 @@ READ16_MEMBER( cdicdic_device::regs_r ) m_x_buffer &= 0x7fff; if(!((m_audio_buffer | m_x_buffer) & 0x8000)) { - state->m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE); + m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE); verboselog(*this, 0, "%s", "Clearing CDIC interrupt line\n" ); ////printf("Clearing CDIC interrupt line\n" ); } @@ -990,8 +989,6 @@ READ16_MEMBER( cdicdic_device::regs_r ) WRITE16_MEMBER( cdicdic_device::regs_w ) { - cdi_state *state = machine().driver_data<cdi_state>(); - uint32_t addr = offset + 0x3c00/2; switch(addr) @@ -1047,18 +1044,18 @@ WRITE16_MEMBER( cdicdic_device::regs_w ) case 0x3ff8/2: { - uint32_t start = state->m_scc->dma().channel[0].memory_address_counter; - uint32_t count = state->m_scc->dma().channel[0].transfer_counter; + uint32_t start = m_scc->dma().channel[0].memory_address_counter; + uint32_t count = m_scc->dma().channel[0].transfer_counter; uint32_t index = 0; uint32_t device_index = (data & 0x3fff) >> 1; - address_space &memory_space = state->m_maincpu->space(AS_PROGRAM); - verboselog(*this, 0, "memory address counter: %08x\n", state->m_scc->dma().channel[0].memory_address_counter); + address_space &memory_space = m_maincpu->space(AS_PROGRAM); + verboselog(*this, 0, "memory address counter: %08x\n", m_scc->dma().channel[0].memory_address_counter); verboselog(*this, 0, "cdic_w: DMA Control Register = %04x & %04x\n", data, mem_mask); verboselog(*this, 0, "Doing copy, transferring %04x bytes\n", count * 2 ); ////printf("Doing copy, transferring %04x bytes\n", count * 2 ); for(index = start / 2; index < (start / 2 + count); index++) { - if(state->m_scc->dma().channel[0].operation_control & OCR_D) + if(m_scc->dma().channel[0].operation_control & OCR_D) { memory_space.write_word(index * 2, m_ram[device_index++]); } @@ -1067,7 +1064,7 @@ WRITE16_MEMBER( cdicdic_device::regs_w ) m_ram[device_index++] = memory_space.read_word(index * 2); } } - state->m_scc->dma().channel[0].memory_address_counter += state->m_scc->dma().channel[0].transfer_counter * 2; + m_scc->dma().channel[0].memory_address_counter += m_scc->dma().channel[0].transfer_counter * 2; break; } @@ -1108,12 +1105,13 @@ WRITE16_MEMBER( cdicdic_device::regs_w ) case 0x2e: // Abort { m_interrupt_timer->adjust(attotime::never); - dmadac_enable(&state->m_dmadac[0], 2, 0); + m_dmadac[0]->enable(0); + m_dmadac[1]->enable(0); //m_data_buffer &= 0xbfff; break; } case 0x2b: // Stop CDDA - state->m_cdda->stop_audio(); + m_cdda->stop_audio(); m_interrupt_timer->adjust(attotime::never); break; case 0x23: // Reset Mode 1 @@ -1160,6 +1158,11 @@ WRITE16_MEMBER( cdicdic_device::regs_w ) cdicdic_device::cdicdic_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, MACHINE_CDICDIC, tag, owner, clock) + , m_maincpu(*this, ":maincpu") + , m_dmadac(*this, ":dac%u", 1U) + , m_scc(*this, ":scc68070") + , m_cdda(*this, ":cdda") + , m_cdrom_dev(*this, ":cdrom") { } @@ -1199,8 +1202,6 @@ void cdicdic_device::device_start() void cdicdic_device::device_reset() { - cdi_state *state = machine().driver_data<cdi_state>(); - m_command = 0; m_time = 0; m_file = 0; @@ -1219,18 +1220,17 @@ void cdicdic_device::device_reset() m_decode_addr = 0; m_decode_delay = 0; - cdrom_image_device *cdrom_dev = machine().device<cdrom_image_device>("cdrom"); - if( cdrom_dev ) + if (m_cdrom_dev) { // MESS case (has CDROM device) - m_cd = cdrom_dev->get_cdrom_file(); - state->m_cdda->set_cdrom(m_cd); + m_cd = m_cdrom_dev->get_cdrom_file(); + m_cdda->set_cdrom(m_cd); } else { // MAME case m_cd = cdrom_open(machine().rom_load().get_disk_handle(":cdrom")); - state->m_cdda->set_cdrom(m_cd); + m_cdda->set_cdrom(m_cd); } } diff --git a/src/mame/machine/cdicdic.h b/src/mame/machine/cdicdic.h index e275ed5739b..1c527a8a78e 100644 --- a/src/mame/machine/cdicdic.h +++ b/src/mame/machine/cdicdic.h @@ -26,8 +26,11 @@ TODO: #pragma once -#include "cdrom.h" +#include "imagedev/chd_cd.h" +#include "machine/cdi070.h" #include "sound/cdda.h" +#include "sound/dmadac.h" +#include "cdrom.h" //************************************************************************** @@ -72,6 +75,12 @@ protected: TIMER_CALLBACK_MEMBER( trigger_readback_int ); private: + required_device<cpu_device> m_maincpu; + required_device_array<dmadac_sound_device, 2> m_dmadac; + required_device<cdi68070_device> m_scc; + required_device<cdda_device> m_cdda; + optional_device<cdrom_image_device> m_cdrom_dev; + // internal state uint16_t m_command; // CDIC Command Register (0x303c00) uint32_t m_time; // CDIC Time Register (0x303c02) diff --git a/src/mame/machine/cdislave.cpp b/src/mame/machine/cdislave.cpp index 5c74f8b6fe8..028f7a50261 100644 --- a/src/mame/machine/cdislave.cpp +++ b/src/mame/machine/cdislave.cpp @@ -56,11 +56,9 @@ static inline void ATTR_PRINTF(3,4) verboselog(device_t& device, int n_level, co TIMER_CALLBACK_MEMBER( cdislave_device::trigger_readback_int ) { - cdi_state *state = machine().driver_data<cdi_state>(); - verboselog(*this, 0, "%s", "Asserting IRQ2\n" ); - state->m_maincpu->set_input_line_vector(M68K_IRQ_2, 26); - state->m_maincpu->set_input_line(M68K_IRQ_2, ASSERT_LINE); + m_maincpu->set_input_line_vector(M68K_IRQ_2, 26); + m_maincpu->set_input_line(M68K_IRQ_2, ASSERT_LINE); m_interrupt_timer->adjust(attotime::never); } @@ -79,11 +77,9 @@ void cdislave_device::prepare_readback(const attotime &delay, uint8_t channel, u void cdislave_device::perform_mouse_update() { - cdi_state *state = machine().driver_data<cdi_state>(); - - uint16_t x = state->m_mousex->read(); - uint16_t y = state->m_mousey->read(); - uint8_t buttons = state->m_mousebtn->read(); + uint16_t x = m_mousex->read(); + uint16_t y = m_mousey->read(); + uint8_t buttons = m_mousebtn->read(); uint16_t old_mouse_x = m_real_mouse_x; uint16_t old_mouse_y = m_real_mouse_y; @@ -124,10 +120,26 @@ INPUT_CHANGED_MEMBER( cdislave_device::mouse_update ) perform_mouse_update(); } -READ16_MEMBER( cdislave_device::slave_r ) +static INPUT_PORTS_START(cdislave_mouse) + PORT_START("MOUSEX") + PORT_BIT(0x3ff, 0x000, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0x3ff) PORT_KEYDELTA(2) PORT_CHANGED_MEMBER(DEVICE_SELF, cdislave_device, mouse_update, 0) + + PORT_START("MOUSEY") + PORT_BIT(0x3ff, 0x000, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0x3ff) PORT_KEYDELTA(2) PORT_CHANGED_MEMBER(DEVICE_SELF, cdislave_device, mouse_update, 0) + + PORT_START("MOUSEBTN") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Mouse Button 1") PORT_CHANGED_MEMBER(DEVICE_SELF, cdislave_device, mouse_update, 0) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Button 2") PORT_CHANGED_MEMBER(DEVICE_SELF, cdislave_device, mouse_update, 0) + PORT_BIT(0xfc, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + +ioport_constructor cdislave_device::device_input_ports() const { - cdi_state *state = machine().driver_data<cdi_state>(); + return INPUT_PORTS_NAME(cdislave_mouse); +} +READ16_MEMBER( cdislave_device::slave_r ) +{ if(m_channel[offset].m_out_count) { uint8_t ret = m_channel[offset].m_out_buf[m_channel[offset].m_out_index]; @@ -143,7 +155,7 @@ READ16_MEMBER( cdislave_device::slave_r ) case 0xf4: case 0xf7: verboselog(*this, 0, "%s", "slave_r: De-asserting IRQ2\n" ); - state->m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); + m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); break; } } @@ -181,8 +193,6 @@ void cdislave_device::set_mouse_position() WRITE16_MEMBER( cdislave_device::slave_w ) { - cdi_state *state = machine().driver_data<cdi_state>(); - switch(offset) { case 0: @@ -302,14 +312,16 @@ WRITE16_MEMBER( cdislave_device::slave_w ) { case 0x82: // Mute Audio verboselog(*this, 0, "slave_w: Channel %d: Mute Audio (0x82)\n", offset ); - dmadac_enable(&state->m_dmadac[0], 2, 0); + m_dmadac[0]->enable(0); + m_dmadac[1]->enable(0); m_in_index = 0; m_in_count = 0; //cdic->audio_sample_timer->adjust(attotime::never); break; case 0x83: // Unmute Audio verboselog(*this, 0, "slave_w: Channel %d: Unmute Audio (0x83)\n", offset ); - dmadac_enable(&state->m_dmadac[0], 2, 1); + m_dmadac[0]->enable(1); + m_dmadac[1]->enable(1); m_in_index = 0; m_in_count = 0; break; @@ -422,6 +434,11 @@ WRITE16_MEMBER( cdislave_device::slave_w ) cdislave_device::cdislave_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, CDISLAVE, tag, owner, clock) + , m_maincpu(*this, ":maincpu") + , m_dmadac(*this, ":dac%u", 1U) + , m_mousex(*this, "MOUSEX") + , m_mousey(*this, "MOUSEY") + , m_mousebtn(*this, "MOUSEBTN") { } diff --git a/src/mame/machine/cdislave.h b/src/mame/machine/cdislave.h index e14a8b71023..46f4a97715f 100644 --- a/src/mame/machine/cdislave.h +++ b/src/mame/machine/cdislave.h @@ -26,6 +26,7 @@ TODO: #pragma once +#include "sound/dmadac.h" //************************************************************************** // INTERFACE CONFIGURATION MACROS @@ -35,6 +36,7 @@ TODO: MCFG_DEVICE_ADD(_tag, CDISLAVE, 0) #define MCFG_CDISLAVE_REPLACE(_tag) \ MCFG_DEVICE_REPLACE(_tag, CDISLAVE, 0) + //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -59,13 +61,19 @@ protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; - virtual void device_post_load() override { } - virtual void device_clock_changed() override { } + virtual ioport_constructor device_input_ports() const override; // internal callbacks TIMER_CALLBACK_MEMBER( trigger_readback_int ); private: + required_device<cpu_device> m_maincpu; + required_device_array<dmadac_sound_device, 2> m_dmadac; + + required_ioport m_mousex; + required_ioport m_mousey; + required_ioport m_mousebtn; + // internal state class channel_state { |