summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/nec/v25sfr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/nec/v25sfr.cpp')
-rw-r--r--src/devices/cpu/nec/v25sfr.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/devices/cpu/nec/v25sfr.cpp b/src/devices/cpu/nec/v25sfr.cpp
index acab173e363..633f8b4681d 100644
--- a/src/devices/cpu/nec/v25sfr.cpp
+++ b/src/devices/cpu/nec/v25sfr.cpp
@@ -24,15 +24,28 @@ void v25_common_device::ida_sfr_map(address_map &map)
map(0x112, 0x112).w(FUNC(v25_common_device::pmc2_w));
map(0x138, 0x138).r(FUNC(v25_common_device::pt_r));
map(0x13b, 0x13b).w(FUNC(v25_common_device::pmt_w));
+ map(0x140, 0x140).rw(FUNC(v25_common_device::intm_r), FUNC(v25_common_device::intm_w));
+ map(0x144, 0x146).rw(FUNC(v25_common_device::ems_r), FUNC(v25_common_device::ems_w));
map(0x14c, 0x14c).rw(FUNC(v25_common_device::exic0_r), FUNC(v25_common_device::exic0_w));
map(0x14d, 0x14d).rw(FUNC(v25_common_device::exic1_r), FUNC(v25_common_device::exic1_w));
map(0x14e, 0x14e).rw(FUNC(v25_common_device::exic2_r), FUNC(v25_common_device::exic2_w));
+ map(0x165, 0x165).rw(FUNC(v25_common_device::srms0_r), FUNC(v25_common_device::srms0_w));
+ map(0x166, 0x166).rw(FUNC(v25_common_device::stms0_r), FUNC(v25_common_device::stms0_w));
+ map(0x16c, 0x16c).rw(FUNC(v25_common_device::seic0_r), FUNC(v25_common_device::seic0_w));
+ map(0x16d, 0x16d).rw(FUNC(v25_common_device::sric0_r), FUNC(v25_common_device::sric0_w));
+ map(0x16e, 0x16e).rw(FUNC(v25_common_device::stic0_r), FUNC(v25_common_device::stic0_w));
+ map(0x175, 0x175).rw(FUNC(v25_common_device::srms1_r), FUNC(v25_common_device::srms1_w));
+ map(0x176, 0x176).rw(FUNC(v25_common_device::stms1_r), FUNC(v25_common_device::stms1_w));
+ map(0x17c, 0x17c).rw(FUNC(v25_common_device::seic1_r), FUNC(v25_common_device::seic1_w));
+ map(0x17d, 0x17d).rw(FUNC(v25_common_device::sric1_r), FUNC(v25_common_device::sric1_w));
+ map(0x17e, 0x17e).rw(FUNC(v25_common_device::stic1_r), FUNC(v25_common_device::stic1_w));
map(0x180, 0x181).rw(FUNC(v25_common_device::tm0_r), FUNC(v25_common_device::tm0_w));
map(0x182, 0x183).rw(FUNC(v25_common_device::md0_r), FUNC(v25_common_device::md0_w));
map(0x188, 0x189).rw(FUNC(v25_common_device::tm1_r), FUNC(v25_common_device::tm1_w));
map(0x18a, 0x18b).rw(FUNC(v25_common_device::md1_r), FUNC(v25_common_device::md1_w));
map(0x190, 0x190).w(FUNC(v25_common_device::tmc0_w));
map(0x191, 0x191).w(FUNC(v25_common_device::tmc1_w));
+ map(0x194, 0x196).rw(FUNC(v25_common_device::tmms_r), FUNC(v25_common_device::tmms_w));
map(0x19c, 0x19c).rw(FUNC(v25_common_device::tmic0_r), FUNC(v25_common_device::tmic0_w));
map(0x19d, 0x19d).rw(FUNC(v25_common_device::tmic1_r), FUNC(v25_common_device::tmic1_w));
map(0x19e, 0x19e).rw(FUNC(v25_common_device::tmic2_r), FUNC(v25_common_device::tmic2_w));
@@ -50,6 +63,7 @@ uint8_t v25_common_device::read_irqcontrol(int /*INTSOURCES*/ source, uint8_t pr
{
return (((m_pending_irq & source) ? 0x80 : 0x00)
| ((m_unmasked_irq & source) ? 0x00 : 0x40)
+ | ((m_macro_service & source) ? 0x20 : 0x00)
| ((m_bankswitch_irq & source) ? 0x10 : 0x00)
| priority);
}
@@ -67,7 +81,12 @@ void v25_common_device::write_irqcontrol(int /*INTSOURCES*/ source, uint8_t d)
m_unmasked_irq |= source;
if (BIT(d, 5))
+ {
logerror("%06x: Warning: macro service function not implemented\n",PC());
+ m_macro_service |= source;
+ }
+ else
+ m_macro_service &= ~source;
if (BIT(d, 4))
m_bankswitch_irq |= source;
@@ -151,6 +170,28 @@ void v25_common_device::pmt_w(uint8_t d)
logerror("%06x: PMT set to %02x\n", PC(), d);
}
+uint8_t v25_common_device::intm_r()
+{
+ return m_intm;
+}
+
+void v25_common_device::intm_w(uint8_t d)
+{
+ logerror("%06x: INTM set to %02x\n", PC(), d & 0x55);
+ m_intm = d & 0x55;
+}
+
+uint8_t v25_common_device::ems_r(offs_t a)
+{
+ return m_ems[a];
+}
+
+void v25_common_device::ems_w(offs_t a, uint8_t d)
+{
+ logerror("%06x: EMS%d set to %02x\n", PC(), a, d & 0xf7);
+ m_ems[a] = d & 0xf7;
+}
+
uint8_t v25_common_device::exic0_r()
{
return read_irqcontrol(INTP0, m_priority_intp);
@@ -182,6 +223,118 @@ void v25_common_device::exic2_w(uint8_t d)
write_irqcontrol(INTP2, d);
}
+uint8_t v25_common_device::srms0_r()
+{
+ return m_srms[0];
+}
+
+void v25_common_device::srms0_w(uint8_t d)
+{
+ logerror("%06x: SRMS0 set to %02x\n", PC(), d & 0xf7);
+ m_srms[0] = d & 0xf7;
+}
+
+uint8_t v25_common_device::stms0_r()
+{
+ return m_stms[0];
+}
+
+void v25_common_device::stms0_w(uint8_t d)
+{
+ logerror("%06x: STMS0 set to %02x\n", PC(), d & 0xf7);
+ m_stms[0] = d & 0xf7;
+}
+
+uint8_t v25_common_device::seic0_r()
+{
+ return read_irqcontrol(INTSER0, m_priority_ints0);
+}
+
+void v25_common_device::seic0_w(uint8_t d)
+{
+ // no macro service for error interrupt
+ write_irqcontrol(INTSER0, d & 0xbf);
+ m_priority_ints0 = d & 0x7;
+}
+
+uint8_t v25_common_device::sric0_r()
+{
+ return read_irqcontrol(INTSR0, m_priority_ints0);
+}
+
+void v25_common_device::sric0_w(uint8_t d)
+{
+ write_irqcontrol(INTSR0, d);
+ m_priority_ints0 = d & 0x7;
+}
+
+uint8_t v25_common_device::stic0_r()
+{
+ return read_irqcontrol(INTST0, m_priority_ints0);
+}
+
+void v25_common_device::stic0_w(uint8_t d)
+{
+ write_irqcontrol(INTST0, d);
+ m_priority_ints0 = d & 0x7;
+}
+
+uint8_t v25_common_device::srms1_r()
+{
+ return m_srms[1];
+}
+
+void v25_common_device::srms1_w(uint8_t d)
+{
+ logerror("%06x: SRMS1 set to %02x\n", PC(), d & 0xf7);
+ m_srms[1] = d & 0xf7;
+}
+
+uint8_t v25_common_device::stms1_r()
+{
+ return m_stms[1];
+}
+
+void v25_common_device::stms1_w(uint8_t d)
+{
+ logerror("%06x: STMS1 set to %02x\n", PC(), d & 0xf7);
+ m_stms[1] = d & 0xf7;
+}
+
+uint8_t v25_common_device::seic1_r()
+{
+ return read_irqcontrol(INTSER1, m_priority_ints1);
+}
+
+void v25_common_device::seic1_w(uint8_t d)
+{
+ // no macro service for error interrupt
+ write_irqcontrol(INTSER1, d & 0xbf);
+ m_priority_ints1 = d & 0x7;
+}
+
+uint8_t v25_common_device::sric1_r()
+{
+ return read_irqcontrol(INTSR1, m_priority_ints1);
+}
+
+void v25_common_device::sric1_w(uint8_t d)
+{
+ write_irqcontrol(INTSR1, d);
+ m_priority_ints1 = d & 0x7;
+}
+
+uint8_t v25_common_device::stic1_r()
+{
+ return read_irqcontrol(INTST1, m_priority_ints1);
+}
+
+void v25_common_device::stic1_w(uint8_t d)
+{
+ write_irqcontrol(INTST1, d);
+ m_priority_ints1 = d & 0x7;
+}
+
uint16_t v25_common_device::tm0_r()
{
if (!machine().side_effects_disabled())
@@ -285,6 +438,17 @@ void v25_common_device::tmc1_w(uint8_t d)
m_timers[2]->adjust(attotime::never);
}
+uint8_t v25_common_device::tmms_r(offs_t a)
+{
+ return m_tmms[a];
+}
+
+void v25_common_device::tmms_w(offs_t a, uint8_t d)
+{
+ logerror("%06x: TMMS%d set to %02x\n", PC(), a, d & 0xf7);
+ m_tmms[a] = d & 0xf7;
+}
+
uint8_t v25_common_device::tmic0_r()
{
return read_irqcontrol(INTTU0, m_priority_inttu);