diff --git a/src/emu/machine/68307.c b/src/emu/machine/68307.c index 829c1b18901..515b07d248d 100644 --- a/src/emu/machine/68307.c +++ b/src/emu/machine/68307.c @@ -66,11 +66,6 @@ m68307cpu_device::m68307cpu_device(const machine_config &mconfig, const char *ta m68307_scrhigh = 0; m68307_scrlow = 0; m68307_currentcs = 0; - - m_m68307_porta_r = 0; - m_m68307_porta_w = 0; - m_m68307_portb_r = 0; - m_m68307_portb_w = 0; } @@ -176,77 +171,77 @@ void m68307cpu_device::init16_m68307(address_space &space) -void m68307_set_port_callbacks(m68307cpu_device *device, m68307_porta_read_callback porta_r, m68307_porta_write_callback porta_w, m68307_portb_read_callback portb_r, m68307_portb_write_callback portb_w) +void m68307cpu_device::set_port_callbacks(m68307_porta_read_delegate porta_r, m68307_porta_write_delegate porta_w, m68307_portb_read_delegate portb_r, m68307_portb_write_delegate portb_w) { - device->m_m68307_porta_r = porta_r; - device->m_m68307_porta_w = porta_w; - device->m_m68307_portb_r = portb_r; - device->m_m68307_portb_w = portb_w; + m_m68307_porta_r = porta_r; + m_m68307_porta_w = porta_w; + m_m68307_portb_r = portb_r; + m_m68307_portb_w = portb_w; } -UINT16 m68307_get_cs(m68307cpu_device *device, offs_t address) +UINT16 m68307cpu_device::get_cs(offs_t address) { - device->m68307_currentcs = m68307_calc_cs(device, address); + m68307_currentcs = m68307_calc_cs(this, address); - return device->m68307_currentcs; + return m68307_currentcs; } /* 68307 specifics - MOVE */ -void m68307_set_interrupt(device_t *device, int level, int vector) +void m68307cpu_device::set_interrupt(int level, int vector) { - device->execute().set_input_line_and_vector(level, HOLD_LINE, vector); + set_input_line_and_vector(level, HOLD_LINE, vector); } -void m68307_timer0_interrupt(m68307cpu_device *cpudev) +void m68307cpu_device::timer0_interrupt() { - int prioritylevel = (cpudev->m68307SIM->m_picr & 0x7000)>>12; - int vector = (cpudev->m68307SIM->m_pivr & 0x00f0) | 0xa; - m68307_set_interrupt(cpudev, prioritylevel, vector); + int prioritylevel = (m68307SIM->m_picr & 0x7000)>>12; + int vector = (m68307SIM->m_pivr & 0x00f0) | 0xa; + set_interrupt(prioritylevel, vector); } -void m68307_timer1_interrupt(m68307cpu_device *cpudev) +void m68307cpu_device::timer1_interrupt() { - int prioritylevel = (cpudev->m68307SIM->m_picr & 0x0700)>>8; - int vector = (cpudev->m68307SIM->m_pivr & 0x00f0) | 0xb; - m68307_set_interrupt(cpudev, prioritylevel, vector); + int prioritylevel = (m68307SIM->m_picr & 0x0700)>>8; + int vector = (m68307SIM->m_pivr & 0x00f0) | 0xb; + set_interrupt(prioritylevel, vector); } -void m68307_serial_interrupt(m68307cpu_device *cpudev, int vector) +void m68307cpu_device::serial_interrupt(int vector) { - int prioritylevel = (cpudev->m68307SIM->m_picr & 0x0070)>>4; - m68307_set_interrupt(cpudev, prioritylevel, vector); + int prioritylevel = (m68307SIM->m_picr & 0x0070)>>4; + set_interrupt(prioritylevel, vector); } WRITE_LINE_MEMBER(m68307cpu_device::m68307_duart_irq_handler) { if (state == ASSERT_LINE) { - m68307_serial_interrupt(this, m_duart->get_irq_vector()); + serial_interrupt(m_duart->get_irq_vector()); } } -void m68307_mbus_interrupt(m68307cpu_device *cpudev) +void m68307cpu_device::mbus_interrupt() { - int prioritylevel = (cpudev->m68307SIM->m_picr & 0x0007)>>0; - int vector = (cpudev->m68307SIM->m_pivr & 0x00f0) | 0xd; - m68307_set_interrupt(cpudev, prioritylevel, vector); + int prioritylevel = (m68307SIM->m_picr & 0x0007)>>0; + int vector = (m68307SIM->m_pivr & 0x00f0) | 0xd; + set_interrupt(prioritylevel, vector); } -void m68307_licr2_interrupt(m68307cpu_device *cpudev) +void m68307cpu_device::licr2_interrupt() { - int prioritylevel = (cpudev->m68307SIM->m_licr2 & 0x0007)>>0; - int vector = (cpudev->m68307SIM->m_pivr & 0x00f0) | 0x9; - cpudev->m68307SIM->m_licr2 |= 0x8; + int prioritylevel = (m68307SIM->m_licr2 & 0x0007)>>0; + int vector = (m68307SIM->m_pivr & 0x00f0) | 0x9; + m68307SIM->m_licr2 |= 0x8; - m68307_set_interrupt(cpudev, prioritylevel, vector); + set_interrupt(prioritylevel, vector); } void m68307cpu_device::device_start() @@ -280,7 +275,7 @@ void m68307cpu_device::device_start() read_inport.resolve(); write_outport.resolve_safe(); - m68307_set_port_callbacks(this, 0,0,0,0); + set_port_callbacks(m68307_porta_read_delegate(),m68307_porta_write_delegate(),m68307_portb_read_delegate(),m68307_portb_write_delegate()); } diff --git a/src/emu/machine/68307.h b/src/emu/machine/68307.h index 53cb9a05c84..73bdc036ef2 100644 --- a/src/emu/machine/68307.h +++ b/src/emu/machine/68307.h @@ -14,11 +14,11 @@ #include "machine/mc68681.h" +typedef device_delegate m68307_porta_read_delegate; +typedef device_delegate m68307_porta_write_delegate; +typedef device_delegate m68307_portb_read_delegate; +typedef device_delegate m68307_portb_write_delegate; -typedef UINT8 (*m68307_porta_read_callback)(address_space &space, bool dedicated, UINT8 line_mask); -typedef void (*m68307_porta_write_callback)(address_space &space, bool dedicated, UINT8 data, UINT8 line_mask); -typedef UINT16 (*m68307_portb_read_callback)(address_space &space, bool dedicated, UINT16 line_mask); -typedef void (*m68307_portb_write_callback)(address_space &space, bool dedicated, UINT16 data, UINT16 line_mask); /* trampolines so we can specify the 68681 serial configuration when adding the CPU */ #define MCFG_MC68307_SERIAL_A_TX_CALLBACK(_cb) \ @@ -92,10 +92,19 @@ public: /* callbacks for internal ports */ - m68307_porta_read_callback m_m68307_porta_r; - m68307_porta_write_callback m_m68307_porta_w; - m68307_portb_read_callback m_m68307_portb_r; - m68307_portb_write_callback m_m68307_portb_w; + void set_port_callbacks(m68307_porta_read_delegate porta_r, m68307_porta_write_delegate porta_w, m68307_portb_read_delegate portb_r, m68307_portb_write_delegate portb_w); + void set_interrupt(int level, int vector); + UINT16 get_cs(offs_t address); + void timer0_interrupt(); + void timer1_interrupt(); + void serial_interrupt(int vector); + void mbus_interrupt(); + void licr2_interrupt(); + + m68307_porta_read_delegate m_m68307_porta_r; + m68307_porta_write_delegate m_m68307_porta_w; + m68307_portb_read_delegate m_m68307_portb_r; + m68307_portb_write_delegate m_m68307_portb_w; void init16_m68307(address_space &space); void init_cpu_m68307(void); @@ -117,12 +126,5 @@ private: static const device_type M68307 = &device_creator; -extern void m68307_set_port_callbacks(m68307cpu_device *device, m68307_porta_read_callback porta_r, m68307_porta_write_callback porta_w, m68307_portb_read_callback portb_r, m68307_portb_write_callback portb_w); -extern UINT16 m68307_get_cs(m68307cpu_device *device, offs_t address); -extern void m68307_timer0_interrupt(m68307cpu_device *cpudev); -extern void m68307_timer1_interrupt(m68307cpu_device *cpudev); -extern void m68307_serial_interrupt(m68307cpu_device *cpudev, int vector); -extern void m68307_mbus_interrupt(m68307cpu_device *cpudev); -extern void m68307_licr2_interrupt(m68307cpu_device *cpudev); #endif diff --git a/src/emu/machine/68307sim.c b/src/emu/machine/68307sim.c index 2f18176e130..00b468a3674 100644 --- a/src/emu/machine/68307sim.c +++ b/src/emu/machine/68307sim.c @@ -153,7 +153,7 @@ UINT16 m68307_sim::read_padat(m68307cpu_device* m68k, address_space &space, UINT { int pc = space.device().safe_pc(); - if (m68k->m_m68307_porta_r) + if (!m68k->m_m68307_porta_r.isnull()) { // for general purpose bits, if configured as 'output' then anything output gets latched // and anything configured as input is read from the port @@ -180,7 +180,7 @@ void m68307_sim::write_padat(m68307cpu_device* m68k, address_space &space, UINT1 int pc = space.device().safe_pc(); COMBINE_DATA(&m_padat); - if (m68k->m_m68307_porta_w) + if (!m68k->m_m68307_porta_w.isnull()) { m68k->m_m68307_porta_w(space, false, data, 0xff); } @@ -204,7 +204,7 @@ UINT16 m68307_sim::read_pbdat(m68307cpu_device* m68k, address_space &space, UINT { int pc = space.device().safe_pc(); - if (m68k->m_m68307_portb_r) + if (!m68k->m_m68307_portb_r.isnull()) { // for general purpose bits, if configured as 'output' then anything output gets latched // and anything configured as input is read from the port @@ -231,7 +231,7 @@ void m68307_sim::write_pbdat(m68307cpu_device* m68k, address_space &space, UINT1 int pc = space.device().safe_pc(); COMBINE_DATA(&m_pbdat); - if (m68k->m_m68307_portb_w) + if (!m68k->m_m68307_portb_w.isnull()) { m68k->m_m68307_portb_w(space, false, data, mem_mask); } diff --git a/src/emu/machine/68307tmu.c b/src/emu/machine/68307tmu.c index 3741fe74cc0..65b480aace2 100644 --- a/src/emu/machine/68307tmu.c +++ b/src/emu/machine/68307tmu.c @@ -105,7 +105,7 @@ static TIMER_CALLBACK( m68307_timer0_callback ) m68307_single_timer* tptr = &m68k->m68307TIMER->singletimer[0]; tptr->regs[m68307TIMER_TMR] |= 0x2; - m68307_timer0_interrupt(m68k); + m68k->timer0_interrupt(); tptr->mametimer->adjust(m68k->cycles_to_attotime(20000)); } @@ -116,7 +116,7 @@ static TIMER_CALLBACK( m68307_timer1_callback ) m68307_single_timer* tptr = &m68k->m68307TIMER->singletimer[1]; tptr->regs[m68307TIMER_TMR] |= 0x2; - m68307_timer1_interrupt(m68k); + m68k->timer1_interrupt(); tptr->mametimer->adjust(m68k->cycles_to_attotime(20000)); diff --git a/src/mame/drivers/bfm_sc4h.c b/src/mame/drivers/bfm_sc4h.c index d91713112bf..f41f136d9f9 100644 --- a/src/mame/drivers/bfm_sc4h.c +++ b/src/mame/drivers/bfm_sc4h.c @@ -112,7 +112,7 @@ READ16_MEMBER(sc4_state::sc4_cs1_r) READ16_MEMBER(sc4_state::sc4_mem_r) { int pc = space.device().safe_pc(); - int cs = m68307_get_cs(m_maincpu, offset * 2); + int cs = m_maincpu->get_cs(offset * 2); int base = 0, end = 0, base2 = 0, end2 = 0; // if (!(debugger_access())) printf("cs is %d\n", cs); UINT16 retvalue; @@ -233,8 +233,6 @@ READ16_MEMBER(sc4_state::sc4_mem_r) return 0x0000; } -static DECLARE_WRITE8_HANDLER( bfm_sc4_reel4_w ); - WRITE8_MEMBER(bfm_sc45_state::mux_output_w) { int i; @@ -268,7 +266,7 @@ WRITE8_MEMBER(bfm_sc45_state::mux_output2_w) WRITE16_MEMBER(sc4_state::sc4_mem_w) { int pc = space.device().safe_pc(); - int cs = m68307_get_cs(m_maincpu, offset * 2); + int cs = m_maincpu->get_cs(offset * 2); int base = 0, end = 0, base2 = 0, end2 = 0; switch ( cs ) @@ -443,111 +441,101 @@ ADDRESS_MAP_END -void bfm_sc4_reset_serial_vfd(running_machine &machine) +void bfm_sc45_state::bfm_sc4_reset_serial_vfd() { - bfm_sc45_state *state = machine.driver_data(); - - state->m_vfd0->reset(); - state->vfd_old_clock = false; + m_vfd0->reset(); + vfd_old_clock = false; } -void bfm_sc45_write_serial_vfd(running_machine &machine, bool cs, bool clock, bool data) +void bfm_sc45_state::bfm_sc45_write_serial_vfd(bool cs, bool clock, bool data) { - bfm_sc45_state *state = machine.driver_data(); - // if we're turned on if ( cs ) { - if ( !state->vfd_enabled ) + if ( !vfd_enabled ) { - bfm_sc4_reset_serial_vfd(machine); - state->vfd_old_clock = clock; - state->vfd_enabled = true; + bfm_sc4_reset_serial_vfd(); + vfd_old_clock = clock; + vfd_enabled = true; } else { // if the clock line changes - if ( clock != state->vfd_old_clock ) + if ( clock != vfd_old_clock ) { if ( !clock ) { //Should move to the internal serial process when DM01 is device-ified // m_vfd0->shift_data(!data); - state->vfd_ser_value <<= 1; - if (data) state->vfd_ser_value |= 1; + vfd_ser_value <<= 1; + if (data) vfd_ser_value |= 1; - state->vfd_ser_count++; - if ( state->vfd_ser_count == 8 ) + vfd_ser_count++; + if ( vfd_ser_count == 8 ) { - state->vfd_ser_count = 0; - if (machine.device("matrix")) + vfd_ser_count = 0; + if (machine().device("matrix")) { - state->m_dm01->writedata(state->vfd_ser_value); + m_dm01->writedata(vfd_ser_value); } else { - state->m_vfd0->write_char(state->vfd_ser_value); + m_vfd0->write_char(vfd_ser_value); } } } - state->vfd_old_clock = clock; + vfd_old_clock = clock; } } } else { - state->vfd_enabled = false; + vfd_enabled = false; } } -void bfm_sc4_68307_porta_w(address_space &space, bool dedicated, UINT8 data, UINT8 line_mask) +void sc4_state::bfm_sc4_68307_porta_w(address_space &space, bool dedicated, UINT8 data, UINT8 line_mask) { - sc4_state *state = space.machine().driver_data(); + m_reel12_latch = data; - state->m_reel12_latch = data; + if ( stepper_update(0, data&0x0f ) ) m_reel_changed |= 0x01; + if ( stepper_update(1, (data>>4))&0x0f ) m_reel_changed |= 0x02; - if ( stepper_update(0, data&0x0f ) ) state->m_reel_changed |= 0x01; - if ( stepper_update(1, (data>>4))&0x0f ) state->m_reel_changed |= 0x02; - - if ( stepper_optic_state(0) ) state->m_optic_pattern |= 0x01; - else state->m_optic_pattern &= ~0x01; - if ( stepper_optic_state(1) ) state->m_optic_pattern |= 0x02; - else state->m_optic_pattern &= ~0x02; + if ( stepper_optic_state(0) ) m_optic_pattern |= 0x01; + else m_optic_pattern &= ~0x01; + if ( stepper_optic_state(1) ) m_optic_pattern |= 0x02; + else m_optic_pattern &= ~0x02; awp_draw_reel(0); awp_draw_reel(1); } -static WRITE8_HANDLER( bfm_sc4_reel3_w ) +WRITE8_MEMBER( sc4_state::bfm_sc4_reel3_w ) { - sc4_state *state = space.machine().driver_data(); + m_reel3_latch = data; - state->m_reel3_latch = data; + if ( stepper_update(2, data&0x0f ) ) m_reel_changed |= 0x04; - if ( stepper_update(2, data&0x0f ) ) state->m_reel_changed |= 0x04; - - if ( stepper_optic_state(2) ) state->m_optic_pattern |= 0x04; - else state->m_optic_pattern &= ~0x04; + if ( stepper_optic_state(2) ) m_optic_pattern |= 0x04; + else m_optic_pattern &= ~0x04; awp_draw_reel(2); } -static WRITE8_HANDLER( bfm_sc4_reel4_w ) +WRITE8_MEMBER( sc4_state::bfm_sc4_reel4_w ) { - sc4_state *state = space.machine().driver_data(); + m_reel4_latch = data; - state->m_reel4_latch = data; + if ( stepper_update(3, data&0x0f ) ) m_reel_changed |= 0x08; - if ( stepper_update(3, data&0x0f ) ) state->m_reel_changed |= 0x08; - - if ( stepper_optic_state(3) ) state->m_optic_pattern |= 0x08; - else state->m_optic_pattern &= ~0x08; + if ( stepper_optic_state(3) ) m_optic_pattern |= 0x08; + else m_optic_pattern &= ~0x08; awp_draw_reel(3); } -void bfm_sc4_68307_portb_w(address_space &space, bool dedicated, UINT16 data, UINT16 line_mask) +void sc4_state::bfm_sc4_68307_portb_w(address_space &space, bool dedicated, UINT16 data, UINT16 line_mask) { // if (dedicated == false) { @@ -556,20 +544,20 @@ void bfm_sc4_68307_portb_w(address_space &space, bool dedicated, UINT16 data, UI // serial output to the VFD at least.. logerror("%08x bfm_sc4_68307_portb_w %04x %04x\n", pc, data, line_mask); - bfm_sc45_write_serial_vfd(space.machine(), (data & 0x4000)?1:0, (data & 0x1000)?1:0, !(data & 0x2000)?1:0); + bfm_sc45_write_serial_vfd((data & 0x4000)?1:0, (data & 0x1000)?1:0, !(data & 0x2000)?1:0); bfm_sc4_reel3_w(space, 0, (data&0x0f00)>>8, 0xff); } } -UINT8 bfm_sc4_68307_porta_r(address_space &space, bool dedicated, UINT8 line_mask) +UINT8 sc4_state::bfm_sc4_68307_porta_r(address_space &space, bool dedicated, UINT8 line_mask) { int pc = space.device().safe_pc(); logerror("%08x bfm_sc4_68307_porta_r\n", pc); - return space.machine().rand(); + return machine().rand(); } -UINT16 bfm_sc4_68307_portb_r(address_space &space, bool dedicated, UINT16 line_mask) +UINT16 sc4_state::bfm_sc4_68307_portb_r(address_space &space, bool dedicated, UINT16 line_mask) { if (dedicated==false) { @@ -605,11 +593,11 @@ MACHINE_START_MEMBER(sc4_state,sc4) m_nvram->set_base(m_mainram, sizeof(m_mainram)); - m68307_set_port_callbacks(m_maincpu, - bfm_sc4_68307_porta_r, - bfm_sc4_68307_porta_w, - bfm_sc4_68307_portb_r, - bfm_sc4_68307_portb_w ); + m_maincpu->set_port_callbacks( + m68307_porta_read_delegate(FUNC(sc4_state::bfm_sc4_68307_porta_r),this), + m68307_porta_write_delegate(FUNC(sc4_state::bfm_sc4_68307_porta_w),this), + m68307_portb_read_delegate(FUNC(sc4_state::bfm_sc4_68307_portb_r),this), + m68307_portb_write_delegate(FUNC(sc4_state::bfm_sc4_68307_portb_w),this) ); int reels = 6; m_reels=reels; @@ -635,7 +623,7 @@ WRITE_LINE_MEMBER(sc4_state::bfm_sc4_duart_irq_handler) logerror("bfm_sc4_duart_irq_handler\n"); if (state == ASSERT_LINE) { - m68307_licr2_interrupt(m_maincpu); + m_maincpu->licr2_interrupt(); } } diff --git a/src/mame/drivers/bfm_sc5.c b/src/mame/drivers/bfm_sc5.c index a23d62b055e..fd1183b46fe 100644 --- a/src/mame/drivers/bfm_sc5.c +++ b/src/mame/drivers/bfm_sc5.c @@ -173,7 +173,7 @@ WRITE8_MEMBER( bfm_sc5_state::sc5_10202F0_w ) switch (offset) { case 0x0: - bfm_sc45_write_serial_vfd(machine(), (data &0x4)?1:0, (data &0x1)?1:0, (data&0x2) ? 0:1); + bfm_sc45_write_serial_vfd((data &0x4)?1:0, (data &0x1)?1:0, (data&0x2) ? 0:1); if (data&0xf8) printf("%s: sc5_10202F0_w %d - %02x\n", machine().describe_context(), offset, data); break; case 0x1: diff --git a/src/mame/includes/bfm_sc45.h b/src/mame/includes/bfm_sc45.h index 1e5fc3c0df1..286a1a11be8 100644 --- a/src/mame/includes/bfm_sc45.h +++ b/src/mame/includes/bfm_sc45.h @@ -42,7 +42,8 @@ public: DECLARE_WRITE8_MEMBER(mux_output_w); DECLARE_WRITE8_MEMBER(mux_output2_w); - + void bfm_sc4_reset_serial_vfd(); + void bfm_sc45_write_serial_vfd(bool cs, bool clock, bool data); }; void bfm_sc45_write_serial_vfd(running_machine &machine, bool cs, bool clock, bool data); @@ -533,6 +534,15 @@ public: DECLARE_MACHINE_RESET(sc4); DECLARE_WRITE_LINE_MEMBER(bfm_sc4_irqhandler); + + void bfm_sc4_68307_porta_w(address_space &space, bool dedicated, UINT8 data, UINT8 line_mask); + DECLARE_WRITE8_MEMBER( bfm_sc4_reel3_w ); + DECLARE_WRITE8_MEMBER( bfm_sc4_reel4_w ); + void bfm_sc4_68307_portb_w(address_space &space, bool dedicated, UINT16 data, UINT16 line_mask); + UINT8 bfm_sc4_68307_porta_r(address_space &space, bool dedicated, UINT8 line_mask); + UINT16 bfm_sc4_68307_portb_r(address_space &space, bool dedicated, UINT16 line_mask); + + protected: required_ioport m_io1; required_ioport m_io2;