diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/machine/timer.h | 10 | ||||
-rw-r--r-- | src/emu/schedule.h | 1 | ||||
-rw-r--r-- | src/mame/drivers/ckz80.cpp | 20 | ||||
-rw-r--r-- | src/mame/drivers/cxgz80.cpp | 19 | ||||
-rw-r--r-- | src/mame/drivers/fidel6502.cpp | 111 | ||||
-rw-r--r-- | src/mame/drivers/fidel68k.cpp | 72 | ||||
-rw-r--r-- | src/mame/drivers/fidelmcs48.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/fidelz80.cpp | 21 | ||||
-rw-r--r-- | src/mame/drivers/novag6502.cpp | 24 | ||||
-rw-r--r-- | src/mame/drivers/novag68k.cpp | 12 | ||||
-rw-r--r-- | src/mame/drivers/novagf8.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/novagmcs48.cpp | 4 | ||||
-rw-r--r-- | src/mame/includes/fidelbase.h | 9 | ||||
-rw-r--r-- | src/mame/includes/novagbase.h | 9 | ||||
-rw-r--r-- | src/mame/mame.lst | 1 |
15 files changed, 189 insertions, 132 deletions
diff --git a/src/devices/machine/timer.h b/src/devices/machine/timer.h index a68718cea22..3fc46b1f179 100644 --- a/src/devices/machine/timer.h +++ b/src/devices/machine/timer.h @@ -111,13 +111,19 @@ public: // adjustments void reset() { adjust(attotime::never, 0, attotime::never); } - void adjust(const attotime &duration, s32 param = 0, const attotime &period = attotime::never) const { assert(m_type == TIMER_TYPE_GENERIC); m_timer->adjust(duration, param, period); } + void adjust(const attotime &duration, s32 param = 0, const attotime &period = attotime::never) + { + assert(m_type == TIMER_TYPE_GENERIC); + m_period = period; + m_timer->adjust(duration, param, period); + } // timing information attotime time_elapsed() const { return m_timer->elapsed(); } attotime time_left() const { return m_timer->remaining(); } attotime start_time() const { return m_timer->start(); } attotime fire_time() const { return m_timer->expire(); } + attotime period() const { return m_period; } private: // device-level overrides @@ -136,7 +142,7 @@ private: // configuration data timer_type m_type; // type of timer - expired_delegate m_callback; // the timer's callback function + expired_delegate m_callback; // the timer's callback function void * m_ptr; // the pointer parameter passed to the timer callback // periodic timers only diff --git a/src/emu/schedule.h b/src/emu/schedule.h index fea68690360..f5631a6f816 100644 --- a/src/emu/schedule.h +++ b/src/emu/schedule.h @@ -83,6 +83,7 @@ public: attotime remaining() const; attotime start() const { return m_start; } attotime expire() const { return m_expire; } + attotime period() const { return m_period; } private: // internal helpers diff --git a/src/mame/drivers/ckz80.cpp b/src/mame/drivers/ckz80.cpp index 1dc3838cc80..dcbb7543bb4 100644 --- a/src/mame/drivers/ckz80.cpp +++ b/src/mame/drivers/ckz80.cpp @@ -40,9 +40,10 @@ Master: class ckz80_state : public driver_device { public: - ckz80_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + ckz80_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_irq_on(*this, "irq_on"), m_dac(*this, "dac"), m_master_map(*this, "master_map"), m_inp_matrix(*this, "IN.%u", 0), @@ -56,6 +57,7 @@ public: // devices/pointers required_device<cpu_device> m_maincpu; + required_device<timer_device> m_irq_on; required_device<dac_2bit_binary_weighted_ones_complement_device> m_dac; optional_device<address_map_bank_device> m_master_map; optional_ioport_array<10> m_inp_matrix; // max 10 @@ -63,8 +65,8 @@ public: output_finder<0x20> m_out_a; output_finder<0x20> m_out_digit; - TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); } - TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); } + template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } + template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } // misc common u16 m_inp_mux; // multiplexed keypad mask @@ -436,13 +438,13 @@ MACHINE_CONFIG_START(ckz80_state::master) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", Z80, 8_MHz_XTAL/2) MCFG_DEVICE_PROGRAM_MAP(master_trampoline) - timer_device &irq_on(TIMER(config, "irq_on")); - irq_on.configure_periodic(FUNC(ckz80_state::irq_on), attotime::from_hz(429)); // theoretical frequency from 555 timer (22nF, 150K, 1K5), measurement was 418Hz - irq_on.set_start_delay(attotime::from_hz(429) - attotime::from_nsec(22870)); // active for 22.87us - TIMER(config, "irq_off").configure_periodic(FUNC(ckz80_state::irq_off), attotime::from_hz(429)); - ADDRESS_MAP_BANK(config, "master_map").set_map(&ckz80_state::master_map).set_options(ENDIANNESS_LITTLE, 8, 16); + const attotime irq_period = attotime::from_hz(429); // theoretical frequency from 555 timer (22nF, 150K, 1K5), measurement was 418Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(ckz80_state::irq_on<INPUT_LINE_IRQ0>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(22870)); // active for 22.87us + TIMER(config, "irq_off").configure_periodic(FUNC(ckz80_state::irq_off<INPUT_LINE_IRQ0>), irq_period); + TIMER(config, "display_decay").configure_periodic(FUNC(ckz80_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_ck_master); diff --git a/src/mame/drivers/cxgz80.cpp b/src/mame/drivers/cxgz80.cpp index 294fccc855d..07bb6909e65 100644 --- a/src/mame/drivers/cxgz80.cpp +++ b/src/mame/drivers/cxgz80.cpp @@ -37,9 +37,10 @@ Chess 2001: class cxgz80_state : public driver_device { public: - cxgz80_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + cxgz80_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_irq_on(*this, "irq_on"), m_dac(*this, "dac"), m_speaker_off_timer(*this, "speaker_off"), m_inp_matrix(*this, "IN.%u", 0), @@ -53,6 +54,7 @@ public: // devices/pointers required_device<cpu_device> m_maincpu; + required_device<timer_device> m_irq_on; required_device<dac_bit_interface> m_dac; required_device<timer_device> m_speaker_off_timer; optional_ioport_array<10> m_inp_matrix; // max 10 @@ -60,8 +62,8 @@ public: output_finder<0x20> m_out_a; output_finder<0x20> m_out_digit; - TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); } - TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); } + template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } + template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } // misc common u16 m_inp_mux; // multiplexed keypad mask @@ -399,10 +401,11 @@ MACHINE_CONFIG_START(cxgz80_state::ch2001) /* basic machine hardware */ Z80(config, m_maincpu, 8_MHz_XTAL/2); m_maincpu->set_addrmap(AS_PROGRAM, &cxgz80_state::ch2001_map); - timer_device &irq_on(TIMER(config, "irq_on")); - irq_on.configure_periodic(FUNC(cxgz80_state::irq_on), attotime::from_hz(484)); // theoretical frequency from 555 timer (22nF, 100K+33K, 1K2), measurement was 568Hz - irq_on.set_start_delay(attotime::from_hz(484) - attotime::from_nsec(18300)); // active for 18.3us - TIMER(config, "irq_off").configure_periodic(FUNC(cxgz80_state::irq_off), attotime::from_hz(484)); + + const attotime irq_period = attotime::from_hz(484); // theoretical frequency from 555 timer (22nF, 100K+33K, 1K2), measurement was 568Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(cxgz80_state::irq_on<INPUT_LINE_IRQ0>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(18300)); // active for 18.3us + TIMER(config, "irq_off").configure_periodic(FUNC(cxgz80_state::irq_off<INPUT_LINE_IRQ0>), irq_period); TIMER(config, m_speaker_off_timer).configure_generic(FUNC(cxgz80_state::speaker_off_callback)); diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp index c74d1f8345f..622b52bea72 100644 --- a/src/mame/drivers/fidel6502.cpp +++ b/src/mame/drivers/fidel6502.cpp @@ -469,13 +469,12 @@ I/O is via TTL, very similar to Designer Display class fidel6502_state : public fidelbase_state { public: - fidel6502_state(const machine_config &mconfig, device_type type, const char *tag) - : fidelbase_state(mconfig, type, tag), + fidel6502_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), m_ppi8255(*this, "ppi8255"), m_rombank(*this, "rombank"), m_mainmap(*this, "mainmap"), - m_div_config(*this, "div_config"), - m_irq_on(*this, "irq_on") + m_div_config(*this, "div_config") { } void csc(machine_config &config); @@ -529,13 +528,8 @@ private: optional_memory_bank m_rombank; optional_device<address_map_bank_device> m_mainmap; optional_ioport m_div_config; - optional_device<timer_device> m_irq_on; // common - TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); } - TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); } - TIMER_DEVICE_CALLBACK_MEMBER(dummy) { ; } // config.m_perfect_cpu_quantum = subtag("maincpu"); didn't work - void div_trampoline_w(offs_t offset, u8 data); u8 div_trampoline_r(offs_t offset); void div_set_cpu_freq(offs_t offset); @@ -1839,10 +1833,10 @@ void fidel6502_state::rsc(machine_config &config) M6502(config, m_maincpu, 1800000); // measured approx 1.81MHz m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::rsc_map); - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(546)); // from 555 timer, measured - m_irq_on->set_start_delay(attotime::from_hz(546) - attotime::from_usec(38)); // active for 38us - - TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(546)); + const attotime irq_period = attotime::from_hz(546); // from 555 timer, measured + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_usec(38)); // active for 38us + TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); pia6821_device &pia(PIA6821(config, "pia", 0)); // MOS 6520 pia.readpa_handler().set(FUNC(fidel6502_state::csc_pia1_pa_r)); @@ -1870,9 +1864,10 @@ void fidel6502_state::csc(machine_config &config) M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // from 3.9MHz resonator m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::csc_map); - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(38.4_kHz_XTAL/64)); // through 4060 IC, 600Hz - m_irq_on->set_start_delay(attotime::from_hz(38.4_kHz_XTAL/64) - attotime::from_hz(38.4_kHz_XTAL*2)); // edge! - TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(38.4_kHz_XTAL/64)); + const attotime irq_period = attotime::from_hz(38.4_kHz_XTAL/64); // through 4060 IC, 600Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_hz(38.4_kHz_XTAL*2)); // edge! + TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); pia6821_device &pia0(PIA6821(config, "pia0", 0)); pia0.readpb_handler().set(FUNC(fidel6502_state::csc_pia0_pb_r)); @@ -1920,14 +1915,14 @@ void fidel6502_state::eas_base(machine_config &config) /* basic machine hardware */ R65C02(config, m_maincpu, 3_MHz_XTAL); m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::div_trampoline); + ADDRESS_MAP_BANK(config, m_mainmap).set_map(&fidel6502_state::eas_map).set_options(ENDIANNESS_LITTLE, 8, 16); - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(38.4_kHz_XTAL/64)); // through 4060 IC, 600Hz - m_irq_on->set_start_delay(attotime::from_hz(38.4_kHz_XTAL/64) - attotime::from_hz(38.4_kHz_XTAL*2)); // edge! + TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(3_MHz_XTAL)); - TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(38.4_kHz_XTAL/64)); - TIMER(config, "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(3_MHz_XTAL)); - - ADDRESS_MAP_BANK(config, m_mainmap).set_map(&fidel6502_state::eas_map).set_options(ENDIANNESS_LITTLE, 8, 16); + const attotime irq_period = attotime::from_hz(38.4_kHz_XTAL/64); // through 4060 IC, 600Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_hz(38.4_kHz_XTAL*2)); // edge! + TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_eas); @@ -1970,9 +1965,8 @@ void fidel6502_state::pc(machine_config &config) /* basic machine hardware */ m_maincpu->set_clock(4_MHz_XTAL); // R65C02P4 - TIMER(config.replace(), "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(4_MHz_XTAL)); - m_mainmap->set_addrmap(AS_PROGRAM, &fidel6502_state::pc_map); + TIMER(config.replace(), "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL)); config.set_default_layout(layout_fidel_pc); } @@ -1984,9 +1978,8 @@ void fidel6502_state::eag(machine_config &config) /* basic machine hardware */ m_maincpu->set_clock(5_MHz_XTAL); // R65C02P4 - TIMER(config.replace(), "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(5_MHz_XTAL)); - m_mainmap->set_addrmap(AS_PROGRAM, &fidel6502_state::eag_map); + TIMER(config.replace(), "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(5_MHz_XTAL)); config.set_default_layout(layout_fidel_eag); } @@ -1996,9 +1989,11 @@ void fidel6502_state::sc9d(machine_config &config) /* basic machine hardware */ M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // R6502AP, 3.9MHz resonator m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::sc9d_map); - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(610)); // from 555 timer (22nF, 102K, 2.7K) - m_irq_on->set_start_delay(attotime::from_hz(610) - attotime::from_usec(41)); // active for 41us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(610)); + + const attotime irq_period = attotime::from_hz(610); // from 555 timer (22nF, 102K, 2.7K) + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us + TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_sc9); @@ -2050,13 +2045,14 @@ void fidel6502_state::sc12(machine_config &config) /* basic machine hardware */ R65C02(config, m_maincpu, 3_MHz_XTAL); // R65C02P3 m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::div_trampoline); - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(630)); // from 556 timer (22nF, 102K, 1K) - m_irq_on->set_start_delay(attotime::from_hz(630) - attotime::from_nsec(15250)); // active for 15.25us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(630)); + ADDRESS_MAP_BANK(config, m_mainmap).set_map(&fidel6502_state::sc12_map).set_options(ENDIANNESS_LITTLE, 8, 16); - TIMER(config, "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(3_MHz_XTAL)); + TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(3_MHz_XTAL)); - ADDRESS_MAP_BANK(config, m_mainmap).set_map(&fidel6502_state::sc12_map).set_options(ENDIANNESS_LITTLE, 8, 16); + const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K) + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us + TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_sc12); @@ -2084,11 +2080,12 @@ void fidel6502_state::sc12b(machine_config &config) m_maincpu->set_clock(4_MHz_XTAL); // R65C02P4 // change irq timer frequency - TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(596)); // from 556 timer (22nF, 82K+26K, 1K) - m_irq_on->set_start_delay(attotime::from_hz(596) - attotime::from_nsec(15250)); // active for 15.25us - TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(596)); + const attotime irq_period = attotime::from_hz(596); // from 556 timer (22nF, 82K+26K, 1K) + TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us + TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); - TIMER(config.replace(), "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(4_MHz_XTAL)); + TIMER(config.replace(), "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL)); } void fidel6502_state::as12(machine_config &config) @@ -2099,9 +2096,10 @@ void fidel6502_state::as12(machine_config &config) m_mainmap->set_addrmap(AS_PROGRAM, &fidel6502_state::as12_map); // change irq timer frequency - TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(585)); // from 556 timer (22nF, 110K, 1K) - m_irq_on->set_start_delay(attotime::from_hz(585) - attotime::from_nsec(15250)); // active for 15.25us - TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(585)); + const attotime irq_period = attotime::from_hz(585); // from 556 timer (22nF, 110K, 1K) + TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us + TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); config.set_default_layout(layout_fidel_as12); } @@ -2111,9 +2109,11 @@ void fidel6502_state::fexcel(machine_config &config) /* basic machine hardware */ M65SC02(config, m_maincpu, 12_MHz_XTAL/4); // G65SC102P-3, 12.0M ceramic resonator m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcel_map); - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(630)); // from 556 timer (22nF, 102K, 1K) - m_irq_on->set_start_delay(attotime::from_hz(630) - attotime::from_nsec(15250)); // active for 15.25us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(630)); + + const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K) + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us + TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_ex); @@ -2169,9 +2169,10 @@ void fidel6502_state::fdes2100(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcelp_map); // change irq timer frequency - TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(585)); // from 556 timer (22nF, 110K, 1K) - m_irq_on->set_start_delay(attotime::from_hz(585) - attotime::from_nsec(15250)); // active for 15.25us - TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(585)); + const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K) + TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us + TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); config.set_default_layout(layout_fidel_des); } @@ -2208,9 +2209,11 @@ void fidel6502_state::fdes2100d(machine_config &config) /* basic machine hardware */ M65C02(config, m_maincpu, 6_MHz_XTAL); // W65C02P-6 m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fdesdis_map); - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(630)); // from 556 timer (22nF, 102K, 1K) - m_irq_on->set_start_delay(attotime::from_hz(630) - attotime::from_nsec(15250)); // active for 15.25us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(630)); + + const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K) + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us + TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_desdis); @@ -2257,9 +2260,11 @@ void fidel6502_state::chesster(machine_config &config) /* basic machine hardware */ R65C02(config, m_maincpu, 5_MHz_XTAL); // RP65C02G m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::chesster_map); - TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(9615)); // R/C circuit, measured - m_irq_on->set_start_delay(attotime::from_hz(9615) - attotime::from_nsec(2600)); // active for 2.6us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(9615)); + + const attotime irq_period = attotime::from_hz(9615); // R/C circuit, measured + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(2600)); // active for 2.6us + TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off<M6502_IRQ_LINE>), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_chesster); diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp index b6e7545e7b4..c7ae6a81799 100644 --- a/src/mame/drivers/fidel68k.cpp +++ b/src/mame/drivers/fidel68k.cpp @@ -12,6 +12,7 @@ TODO: - USART is not emulated + - V5 CPU comms is unemulated, it's still playable but not at all as intended - V9(68030 @ 32MHz) is faster than V10(68040 @ 25MHz) but it should be the other way around, culprit is unemulated cache? - V11 CPU should be M68EC060, not yet emulated. Now using M68EC040 in its place @@ -68,7 +69,7 @@ V1: 128KB DRAM, no EEPROM V2: 128KB DRAM V3: 512KB DRAM V4: 1MB DRAM -V5: 128KB+64KB DRAM, dual-CPU! (2*68K @ 16MHz) +V5: 128KB+16KB DRAM, dual-CPU! (2*68K @ 16MHz) V6-V11 are on model 6117. Older 1986 model 6081/6088/6089 uses a 6502 CPU. @@ -112,7 +113,7 @@ Memory map: (of what is known) Elite Avant Garde (EAG, model 6117) ----------------------------------- -There are 6 versions of model 6114(V6 to V11). From a programmer's point of view, +There are 6 versions of model 6117(V6 to V11). From a programmer's point of view, the hardware is very similar to model 6114. V6: 68020, 512KB hashtable RAM @@ -197,8 +198,8 @@ B0000x-xxxxxx: see V7, -800000 class fidel68k_state : public fidelbase_state { public: - fidel68k_state(const machine_config &mconfig, device_type type, const char *tag) - : fidelbase_state(mconfig, type, tag), + fidel68k_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag), m_ram(*this, "ram") { } @@ -212,6 +213,7 @@ public: void eag_base(machine_config &config); void eag(machine_config &config); + void eagv5(machine_config &config); void eagv7(machine_config &config); void eagv9(machine_config &config); void eagv10(machine_config &config); @@ -221,9 +223,6 @@ public: private: optional_device<ram_device> m_ram; - TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M68K_IRQ_2, ASSERT_LINE); } - TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); } - // Excel 68000 DECLARE_WRITE8_MEMBER(fex68k_mux_w); void fex68k_map(address_map &map); @@ -247,6 +246,7 @@ private: void eag_map(address_map &map); void eagv7_map(address_map &map); void eagv11_map(address_map &map); + void eagv5_slave_map(address_map &map); }; @@ -451,7 +451,7 @@ void fidel68k_state::fdes2325_map(address_map &map) void fidel68k_state::init_eag() { - // eag_map: DRAM slots at $200000-$2fffff - V1/V2: 128K, V3: 512K, V4: 1M + // eag_map: DRAM slots at $200000-$2fffff - V1/V2/V5: 128K, V3: 512K, V4: 1M m_maincpu->space(AS_PROGRAM).install_ram(0x200000, 0x200000 + m_ram->size() - 1, m_ram->pointer()); } @@ -497,6 +497,12 @@ void fidel68k_state::eagv11_map(address_map &map) map(0x01000000, 0x0101ffff).ram(); } +void fidel68k_state::eagv5_slave_map(address_map &map) +{ + map(0x000000, 0x00ffff).rom(); + map(0x044000, 0x047fff).ram(); +} + /****************************************************************************** @@ -567,10 +573,11 @@ MACHINE_CONFIG_START(fidel68k_state::fex68k) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", M68000, 12_MHz_XTAL) // HD68HC000P12 MCFG_DEVICE_PROGRAM_MAP(fex68k_map) - timer_device &irq_on(TIMER(config, "irq_on")); - irq_on.configure_periodic(FUNC(fidel68k_state::irq_on), attotime::from_hz(618)); // theoretical frequency from 556 timer (22nF, 91K + 20K POT @ 14.8K, 0.1K), measurement was 580Hz - irq_on.set_start_delay(attotime::from_hz(597) - attotime::from_nsec(1528)); // active for 1.525us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off), attotime::from_hz(618)); + + const attotime irq_period = attotime::from_hz(618); // theoretical frequency from 556 timer (22nF, 91K + 20K POT @ 14.8K, 0.1K), measurement was 580Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel68k_state::irq_on<M68K_IRQ_2>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(1528)); // active for 1.525us + TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off<M68K_IRQ_2>), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_ex_68k); @@ -604,10 +611,11 @@ MACHINE_CONFIG_START(fidel68k_state::fdes2265) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", M68000, 16_MHz_XTAL) // MC68HC000P12F MCFG_DEVICE_PROGRAM_MAP(fdes2265_map) - timer_device &irq_on(TIMER(config, "irq_on")); - irq_on.configure_periodic(FUNC(fidel68k_state::irq_on), attotime::from_hz(597)); // from 555 timer, measured - irq_on.set_start_delay(attotime::from_hz(597) - attotime::from_nsec(6000)); // active for 6us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off), attotime::from_hz(597)); + + const attotime irq_period = attotime::from_hz(597); // from 555 timer, measured + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel68k_state::irq_on<M68K_IRQ_4>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(6000)); // active for 6us + TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off<M68K_IRQ_4>), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_desdis_68kr); @@ -634,10 +642,11 @@ MACHINE_CONFIG_START(fidel68k_state::eag_base) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", M68000, 16_MHz_XTAL) MCFG_DEVICE_PROGRAM_MAP(eag_map) - timer_device &irq_on(TIMER(config, "irq_on")); - irq_on.configure_periodic(FUNC(fidel68k_state::irq_on), attotime::from_hz(4.9152_MHz_XTAL/0x2000)); // 600Hz - irq_on.set_start_delay(attotime::from_hz(4.9152_MHz_XTAL/0x2000) - attotime::from_nsec(8250)); // active for 8.25us - TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off), attotime::from_hz(4.9152_MHz_XTAL/0x2000)); + + const attotime irq_period = attotime::from_hz(4.9152_MHz_XTAL/0x2000); // 600Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(fidel68k_state::irq_on<M68K_IRQ_2>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(8250)); // active for 8.25us + TIMER(config, "irq_off").configure_periodic(FUNC(fidel68k_state::irq_off<M68K_IRQ_2>), irq_period); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); @@ -660,9 +669,19 @@ MACHINE_CONFIG_END void fidel68k_state::eag(machine_config &config) { eag_base(config); - RAM(config, "ram").set_default_size("1M").set_extra_options("128K, 512K, 1M"); + RAM(config, m_ram).set_default_size("1M").set_extra_options("128K, 512K, 1M"); } +MACHINE_CONFIG_START(fidel68k_state::eagv5) + eag(config); + + /* basic machine hardware */ + m_ram->set_default_size("128K"); + + MCFG_DEVICE_ADD("subcpu", M68000, 16_MHz_XTAL) + MCFG_DEVICE_PROGRAM_MAP(eagv5_slave_map) +MACHINE_CONFIG_END + MACHINE_CONFIG_START(fidel68k_state::eagv7) eag_base(config); @@ -763,6 +782,16 @@ ROM_START( feagv2a ) // from a V3 board ROM_LOAD16_BYTE("elite_1.6_o.u19", 0x00001, 0x10000, CRC(904c7061) SHA1(742110576cf673321440bc81a4dae4c949b49e38) ) ROM_END +ROM_START( feagv5 ) + ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_LOAD16_BYTE("master_e", 0x00000, 0x10000, CRC(e424bddc) SHA1(ff03656addfe5c47f06df2efb4602f43a9e19d96) ) + ROM_LOAD16_BYTE("master_o", 0x00001, 0x10000, CRC(33a00894) SHA1(849460332b1ac10d452ca3631eb99f5597511b73) ) + + ROM_REGION( 0x10000, "subcpu", 0 ) + ROM_LOAD16_BYTE("slave_e", 0x00000, 0x08000, CRC(eea4de52) SHA1(a64ca8a44b431e2fa7f00e44cab7e6aa2d4a9403) ) + ROM_LOAD16_BYTE("slave_o", 0x00001, 0x08000, CRC(35fe2fdf) SHA1(731da12ee290bad9bc03cffe281c8cc48e555dfb) ) +ROM_END + ROM_START( feagv7 ) ROM_REGION( 0x20000, "maincpu", 0 ) ROM_LOAD16_BYTE("eag-v7b", 0x00000, 0x10000, CRC(f2f68b63) SHA1(621e5073e9c5083ac9a9b467f3ef8aa29beac5ac) ) @@ -815,6 +844,7 @@ CONS( 1991, fdes2325, fdes2265, 0, fdes2325, fdes68k, fidel68k_state, empty_init CONS( 1989, feagv2, 0, 0, eag, eag, fidel68k_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1989, feagv2a, feagv2, 0, eag, eag, fidel68k_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1989, feagv5, feagv2, 0, eagv5, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6114-5)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING ) CONS( 1990, feagv7, feagv2, 0, eagv7, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1990, feagv7a, feagv2, 0, eagv7, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) CONS( 1990, feagv9, feagv2, 0, eagv9, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) diff --git a/src/mame/drivers/fidelmcs48.cpp b/src/mame/drivers/fidelmcs48.cpp index 9eea50369c8..267f14eaa61 100644 --- a/src/mame/drivers/fidelmcs48.cpp +++ b/src/mame/drivers/fidelmcs48.cpp @@ -37,8 +37,8 @@ Sensory Chess Challenger 6 (model SC6): class fidelmcs48_state : public fidelbase_state { public: - fidelmcs48_state(const machine_config &mconfig, device_type type, const char *tag) - : fidelbase_state(mconfig, type, tag) + fidelmcs48_state(const machine_config &mconfig, device_type type, const char *tag) : + fidelbase_state(mconfig, type, tag) { } void sc6(machine_config &config); diff --git a/src/mame/drivers/fidelz80.cpp b/src/mame/drivers/fidelz80.cpp index 1fb44232036..f4a4c414aa1 100644 --- a/src/mame/drivers/fidelz80.cpp +++ b/src/mame/drivers/fidelz80.cpp @@ -524,8 +524,7 @@ public: m_ppi8255(*this, "ppi8255"), m_i8243(*this, "i8243"), m_beeper_off(*this, "beeper_off"), - m_beeper(*this, "beeper"), - m_irq_on(*this, "irq_on") + m_beeper(*this, "beeper") { } void cc10(machine_config &config); @@ -550,10 +549,6 @@ private: optional_device<i8243_device> m_i8243; optional_device<timer_device> m_beeper_off; optional_device<beep_device> m_beeper; - optional_device<timer_device> m_irq_on; - - TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); } - TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); } // CC10, VCC/UVC void vcc_prepare_display(); @@ -1850,7 +1845,11 @@ void fidelz80_state::vsc(machine_config &config) Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::vsc_map); m_maincpu->set_addrmap(AS_IO, &fidelz80_state::vsc_io); - m_maincpu->set_periodic_int(FUNC(fidelz80_state::nmi_line_pulse), attotime::from_hz(587)); // 555 timer, measured + + const attotime irq_period = attotime::from_hz(587); // 555 timer, measured + TIMER(config, m_irq_on).configure_periodic(FUNC(fidelz80_state::irq_on<INPUT_LINE_NMI>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_usec(845)); // active for 0.845ms (approx half) + TIMER(config, "irq_off").configure_periodic(FUNC(fidelz80_state::irq_off<INPUT_LINE_NMI>), irq_period); I8255(config, m_ppi8255); m_ppi8255->out_pa_callback().set(FUNC(fidelz80_state::vsc_ppi_porta_w)); @@ -1935,9 +1934,11 @@ void fidelz80_state::dsc(machine_config &config) /* basic machine hardware */ Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::dsc_map); - TIMER(config, m_irq_on).configure_periodic(FUNC(fidelz80_state::irq_on), attotime::from_hz(523)); // from 555 timer (22nF, 120K, 2.7K) - m_irq_on->set_start_delay(attotime::from_hz(523) - attotime::from_usec(41)); // active for 41us - TIMER(config, "irq_off").configure_periodic(FUNC(fidelz80_state::irq_off), attotime::from_hz(523)); + + const attotime irq_period = attotime::from_hz(523); // from 555 timer (22nF, 120K, 2.7K) + TIMER(config, m_irq_on).configure_periodic(FUNC(fidelz80_state::irq_on<INPUT_LINE_IRQ0>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us + TIMER(config, "irq_off").configure_periodic(FUNC(fidelz80_state::irq_off<INPUT_LINE_IRQ0>), irq_period); TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1)); config.set_default_layout(layout_fidel_dsc); diff --git a/src/mame/drivers/novag6502.cpp b/src/mame/drivers/novag6502.cpp index 5854ecede2d..6778501ca26 100644 --- a/src/mame/drivers/novag6502.cpp +++ b/src/mame/drivers/novag6502.cpp @@ -97,9 +97,6 @@ private: optional_device<hlcd0538_device> m_hlcd0538; optional_memory_bank m_rombank; - TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); } - TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); } - // Super Constellation DECLARE_WRITE8_MEMBER(supercon_mux_w); DECLARE_WRITE8_MEMBER(supercon_control_w); @@ -894,10 +891,11 @@ MACHINE_CONFIG_START(novag6502_state::cforte) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", R65C02, 10_MHz_XTAL/2) MCFG_DEVICE_PROGRAM_MAP(cforte_map) - timer_device &irq_on(TIMER(config, "irq_on")); - irq_on.configure_periodic(FUNC(novag6502_state::irq_on), attotime::from_hz(32.768_kHz_XTAL/128)); // 256Hz - irq_on.set_start_delay(attotime::from_hz(32.768_kHz_XTAL/128) - attotime::from_usec(11)); // active for 11us - TIMER(config, "irq_off").configure_periodic(FUNC(novag6502_state::irq_off), attotime::from_hz(32.768_kHz_XTAL/128)); + + const attotime irq_period = attotime::from_hz(32.768_kHz_XTAL/128); // 256Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(novag6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_usec(11)); // active for 11us + TIMER(config, "irq_off").configure_periodic(FUNC(novag6502_state::irq_off<M6502_IRQ_LINE>), irq_period); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); @@ -919,10 +917,11 @@ MACHINE_CONFIG_START(novag6502_state::sexpert) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", M65C02, 10_MHz_XTAL/2) // or 12_MHz_XTAL/2 MCFG_DEVICE_PROGRAM_MAP(sexpert_map) - timer_device &irq_on(TIMER(config, "irq_on")); - irq_on.configure_periodic(FUNC(novag6502_state::irq_on), attotime::from_hz(32.768_kHz_XTAL/128)); // 256Hz - irq_on.set_start_delay(attotime::from_hz(32.768_kHz_XTAL/128) - attotime::from_nsec(21500)); // active for 21.5us - TIMER(config, "irq_off").configure_periodic(FUNC(novag6502_state::irq_off), attotime::from_hz(32.768_kHz_XTAL/128)); + + const attotime irq_period = attotime::from_hz(32.768_kHz_XTAL/128); // 256Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(novag6502_state::irq_on<M6502_IRQ_LINE>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(21500)); // active for 21.5us + TIMER(config, "irq_off").configure_periodic(FUNC(novag6502_state::irq_off<M6502_IRQ_LINE>), irq_period); mos6551_device &acia(MOS6551(config, "acia", 0)); // R65C51P2 - RTS to CTS, DCD to GND acia.set_xtal(1.8432_MHz_XTAL); @@ -968,7 +967,8 @@ MACHINE_CONFIG_START(novag6502_state::sforte) /* basic machine hardware */ MCFG_DEVICE_MODIFY("maincpu") MCFG_DEVICE_PROGRAM_MAP(sforte_map) - subdevice<timer_device>("irq_on")->set_start_delay(attotime::from_hz(32.768_kHz_XTAL/128) - attotime::from_usec(11)); // active for ?us (assume same as cforte) + + m_irq_on->set_start_delay(m_irq_on->period() - attotime::from_usec(11)); // active for ?us (assume same as cforte) config.set_default_layout(layout_novag_sforte); MACHINE_CONFIG_END diff --git a/src/mame/drivers/novag68k.cpp b/src/mame/drivers/novag68k.cpp index f396ca9b476..c153e2af0fa 100644 --- a/src/mame/drivers/novag68k.cpp +++ b/src/mame/drivers/novag68k.cpp @@ -51,9 +51,6 @@ public: void scorpio68k(machine_config &config); private: - TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M68K_IRQ_2, ASSERT_LINE); } - TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); } - // Diablo 68000 DECLARE_WRITE8_MEMBER(diablo68k_control_w); DECLARE_WRITE8_MEMBER(diablo68k_lcd_data_w); @@ -230,10 +227,11 @@ MACHINE_CONFIG_START(novag68k_state::diablo68k) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", M68000, 16_MHz_XTAL) MCFG_DEVICE_PROGRAM_MAP(diablo68k_map) - timer_device &irq_on(TIMER(config, "irq_on")); - irq_on.configure_periodic(FUNC(novag68k_state::irq_on), attotime::from_hz(32.768_kHz_XTAL/128)); // 256Hz - irq_on.set_start_delay(attotime::from_hz(32.768_kHz_XTAL/128) - attotime::from_nsec(1100)); // active for 1.1us - TIMER(config, "irq_off").configure_periodic(FUNC(novag68k_state::irq_off), attotime::from_hz(32.768_kHz_XTAL/128)); + + const attotime irq_period = attotime::from_hz(32.768_kHz_XTAL/128); // 256Hz + TIMER(config, m_irq_on).configure_periodic(FUNC(novag68k_state::irq_on<M68K_IRQ_2>), irq_period); + m_irq_on->set_start_delay(irq_period - attotime::from_nsec(1100)); // active for 1.1us + TIMER(config, "irq_off").configure_periodic(FUNC(novag68k_state::irq_off<M68K_IRQ_2>), irq_period); mos6551_device &acia(MOS6551(config, "acia", 0)); acia.set_xtal(1.8432_MHz_XTAL); diff --git a/src/mame/drivers/novagf8.cpp b/src/mame/drivers/novagf8.cpp index a355c4278e2..514ed828b28 100644 --- a/src/mame/drivers/novagf8.cpp +++ b/src/mame/drivers/novagf8.cpp @@ -32,8 +32,8 @@ Delta-1: class novagf8_state : public novagbase_state { public: - novagf8_state(const machine_config &mconfig, device_type type, const char *tag) - : novagbase_state(mconfig, type, tag) + novagf8_state(const machine_config &mconfig, device_type type, const char *tag) : + novagbase_state(mconfig, type, tag) { } void delta1(machine_config &config); diff --git a/src/mame/drivers/novagmcs48.cpp b/src/mame/drivers/novagmcs48.cpp index ffd5d81ec9e..46523cac1f1 100644 --- a/src/mame/drivers/novagmcs48.cpp +++ b/src/mame/drivers/novagmcs48.cpp @@ -41,8 +41,8 @@ Otherwise, it's identical to Presto. The MCU internal ROM is same too. class novagmcs48_state : public novagbase_state { public: - novagmcs48_state(const machine_config &mconfig, device_type type, const char *tag) - : novagbase_state(mconfig, type, tag) + novagmcs48_state(const machine_config &mconfig, device_type type, const char *tag) : + novagbase_state(mconfig, type, tag) { } void presto(machine_config &config); diff --git a/src/mame/includes/fidelbase.h b/src/mame/includes/fidelbase.h index ea803d63ccf..97f1a3b5cfc 100644 --- a/src/mame/includes/fidelbase.h +++ b/src/mame/includes/fidelbase.h @@ -22,9 +22,10 @@ class fidelbase_state : public driver_device { public: - fidelbase_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + fidelbase_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_irq_on(*this, "irq_on"), m_inp_matrix(*this, "IN.%u", 0), m_out_x(*this, "%u.%u", 0U, 0U), m_out_a(*this, "%u.a", 0U), @@ -40,6 +41,7 @@ public: // devices/pointers required_device<cpu_device> m_maincpu; + optional_device<timer_device> m_irq_on; optional_ioport_array<11> m_inp_matrix; // max 11 output_finder<0x20, 0x20> m_out_x; output_finder<0x20> m_out_a; @@ -61,6 +63,9 @@ public: DECLARE_DEVICE_IMAGE_LOAD_MEMBER(scc_cartridge); virtual DECLARE_READ8_MEMBER(cartridge_r); + template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } + template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } + // display common int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) int m_display_maxy; // display matrix number of rows diff --git a/src/mame/includes/novagbase.h b/src/mame/includes/novagbase.h index 8957c6fafd9..fce586e3e5b 100644 --- a/src/mame/includes/novagbase.h +++ b/src/mame/includes/novagbase.h @@ -22,8 +22,9 @@ class novagbase_state : public driver_device public: novagbase_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_beeper(*this, "beeper"), m_maincpu(*this, "maincpu"), + m_irq_on(*this, "irq_on"), + m_beeper(*this, "beeper"), m_dac(*this, "dac"), m_lcd(*this, "hd44780"), m_inp_matrix(*this, "IN.%u", 0), @@ -40,8 +41,9 @@ protected: virtual void machine_reset() override; // devices/pointers - optional_device<beep_device> m_beeper; required_device<cpu_device> m_maincpu; + optional_device<timer_device> m_irq_on; + optional_device<beep_device> m_beeper; optional_device<dac_bit_interface> m_dac; optional_device<hd44780_device> m_lcd; optional_ioport_array<9> m_inp_matrix; // max 9 @@ -58,6 +60,9 @@ protected: u16 read_inputs(int columns); + template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(L, ASSERT_LINE); } + template<int L> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(L, CLEAR_LINE); } + // display common int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) int m_display_maxy; // display matrix number of rows diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 340e8c498f4..7a959e6d5e2 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -12909,6 +12909,7 @@ feagv10 // feagv11 // feagv2 // feagv2a // +feagv5 // feagv7 // feagv7a // feagv9 // |