summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/devices/machine/timer.h10
-rw-r--r--src/emu/schedule.h1
-rw-r--r--src/mame/drivers/ckz80.cpp20
-rw-r--r--src/mame/drivers/cxgz80.cpp19
-rw-r--r--src/mame/drivers/fidel6502.cpp111
-rw-r--r--src/mame/drivers/fidel68k.cpp72
-rw-r--r--src/mame/drivers/fidelmcs48.cpp4
-rw-r--r--src/mame/drivers/fidelz80.cpp21
-rw-r--r--src/mame/drivers/novag6502.cpp24
-rw-r--r--src/mame/drivers/novag68k.cpp12
-rw-r--r--src/mame/drivers/novagf8.cpp4
-rw-r--r--src/mame/drivers/novagmcs48.cpp4
-rw-r--r--src/mame/includes/fidelbase.h9
-rw-r--r--src/mame/includes/novagbase.h9
-rw-r--r--src/mame/mame.lst1
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 //