v25: Add more interrupt SFRs, including underpinnings for macro service (nw)

This commit is contained in:
AJR 2019-08-07 12:29:46 -04:00
parent 1cab21dc41
commit a53c0b4612
3 changed files with 210 additions and 3 deletions

View File

@ -194,6 +194,7 @@ void v25_common_device::device_reset()
m_ParityVal = 1; m_ParityVal = 1;
m_pending_irq = 0; m_pending_irq = 0;
m_unmasked_irq = INT_IRQ | NMI_IRQ; m_unmasked_irq = INT_IRQ | NMI_IRQ;
m_macro_service = 0;
m_bankswitch_irq = 0; m_bankswitch_irq = 0;
m_priority_inttu = 7; m_priority_inttu = 7;
m_priority_intd = 7; m_priority_intd = 7;
@ -205,9 +206,7 @@ void v25_common_device::device_reset()
m_irq_state = 0; m_irq_state = 0;
m_poll_state = 1; m_poll_state = 1;
m_mode_state = m_MF = (m_v25v35_decryptiontable) ? 0 : 1; m_mode_state = m_MF = (m_v25v35_decryptiontable) ? 0 : 1;
m_intp_state[0] = 0; m_intm = 0;
m_intp_state[1] = 0;
m_intp_state[2] = 0;
m_halted = 0; m_halted = 0;
m_TM0 = m_MD0 = m_TM1 = m_MD1 = 0; m_TM0 = m_MD0 = m_TM1 = m_MD1 = 0;
@ -464,6 +463,12 @@ void v25_common_device::device_start()
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
m_timers[i] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(v25_common_device::v25_timer_callback),this)); m_timers[i] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(v25_common_device::v25_timer_callback),this));
std::fill_n(&m_intp_state[0], 3, 0);
std::fill_n(&m_ems[0], 3, 0);
std::fill_n(&m_srms[0], 2, 0);
std::fill_n(&m_stms[0], 2, 0);
std::fill_n(&m_tmms[0], 3, 0);
save_item(NAME(m_intp_state)); save_item(NAME(m_intp_state));
save_item(NAME(m_ip)); save_item(NAME(m_ip));
@ -484,12 +489,17 @@ void v25_common_device::device_start()
save_item(NAME(m_ParityVal)); save_item(NAME(m_ParityVal));
save_item(NAME(m_pending_irq)); save_item(NAME(m_pending_irq));
save_item(NAME(m_unmasked_irq)); save_item(NAME(m_unmasked_irq));
save_item(NAME(m_macro_service));
save_item(NAME(m_bankswitch_irq)); save_item(NAME(m_bankswitch_irq));
save_item(NAME(m_priority_inttu)); save_item(NAME(m_priority_inttu));
save_item(NAME(m_priority_intd)); save_item(NAME(m_priority_intd));
save_item(NAME(m_priority_intp)); save_item(NAME(m_priority_intp));
save_item(NAME(m_priority_ints0)); save_item(NAME(m_priority_ints0));
save_item(NAME(m_priority_ints1)); save_item(NAME(m_priority_ints1));
save_item(NAME(m_ems));
save_item(NAME(m_srms));
save_item(NAME(m_stms));
save_item(NAME(m_tmms));
save_item(NAME(m_IRQS)); save_item(NAME(m_IRQS));
save_item(NAME(m_ISPR)); save_item(NAME(m_ISPR));
save_item(NAME(m_nmi_state)); save_item(NAME(m_nmi_state));
@ -497,6 +507,7 @@ void v25_common_device::device_start()
save_item(NAME(m_poll_state)); save_item(NAME(m_poll_state));
save_item(NAME(m_mode_state)); save_item(NAME(m_mode_state));
save_item(NAME(m_no_interrupt)); save_item(NAME(m_no_interrupt));
save_item(NAME(m_intm));
save_item(NAME(m_halted)); save_item(NAME(m_halted));
save_item(NAME(m_TM0)); save_item(NAME(m_TM0));
save_item(NAME(m_MD0)); save_item(NAME(m_MD0));

View File

@ -88,14 +88,20 @@ private:
/* interrupt related */ /* interrupt related */
uint32_t m_pending_irq; uint32_t m_pending_irq;
uint32_t m_unmasked_irq; uint32_t m_unmasked_irq;
uint32_t m_macro_service;
uint32_t m_bankswitch_irq; uint32_t m_bankswitch_irq;
uint8_t m_priority_inttu, m_priority_intd, m_priority_intp, m_priority_ints0, m_priority_ints1; uint8_t m_priority_inttu, m_priority_intd, m_priority_intp, m_priority_ints0, m_priority_ints1;
uint8_t m_ems[3];
uint8_t m_srms[2];
uint8_t m_stms[2];
uint8_t m_tmms[3];
uint8_t m_IRQS, m_ISPR; uint8_t m_IRQS, m_ISPR;
uint32_t m_nmi_state; uint32_t m_nmi_state;
uint32_t m_irq_state; uint32_t m_irq_state;
uint32_t m_poll_state; uint32_t m_poll_state;
uint32_t m_mode_state; uint32_t m_mode_state;
uint32_t m_intp_state[3]; uint32_t m_intp_state[3];
uint8_t m_intm;
uint8_t m_no_interrupt; uint8_t m_no_interrupt;
uint8_t m_halted; uint8_t m_halted;
@ -175,12 +181,36 @@ private:
void pmc2_w(uint8_t d); void pmc2_w(uint8_t d);
uint8_t pt_r(); uint8_t pt_r();
void pmt_w(uint8_t d); void pmt_w(uint8_t d);
uint8_t intm_r();
void intm_w(uint8_t d);
uint8_t ems_r(offs_t a);
void ems_w(offs_t a, uint8_t d);
uint8_t exic0_r(); uint8_t exic0_r();
void exic0_w(uint8_t d); void exic0_w(uint8_t d);
uint8_t exic1_r(); uint8_t exic1_r();
void exic1_w(uint8_t d); void exic1_w(uint8_t d);
uint8_t exic2_r(); uint8_t exic2_r();
void exic2_w(uint8_t d); void exic2_w(uint8_t d);
uint8_t srms0_r();
void srms0_w(uint8_t d);
uint8_t stms0_r();
void stms0_w(uint8_t d);
uint8_t seic0_r();
void seic0_w(uint8_t d);
uint8_t sric0_r();
void sric0_w(uint8_t d);
uint8_t stic0_r();
void stic0_w(uint8_t d);
uint8_t srms1_r();
void srms1_w(uint8_t d);
uint8_t stms1_r();
void stms1_w(uint8_t d);
uint8_t seic1_r();
void seic1_w(uint8_t d);
uint8_t sric1_r();
void sric1_w(uint8_t d);
uint8_t stic1_r();
void stic1_w(uint8_t d);
uint16_t tm0_r(); uint16_t tm0_r();
void tm0_w(uint16_t d); void tm0_w(uint16_t d);
uint16_t md0_r(); uint16_t md0_r();
@ -191,6 +221,8 @@ private:
void md1_w(uint16_t d); void md1_w(uint16_t d);
void tmc0_w(uint8_t d); void tmc0_w(uint8_t d);
void tmc1_w(uint8_t d); void tmc1_w(uint8_t d);
uint8_t tmms_r(offs_t a);
void tmms_w(offs_t a, uint8_t d);
uint8_t tmic0_r(); uint8_t tmic0_r();
void tmic0_w(uint8_t d); void tmic0_w(uint8_t d);
uint8_t tmic1_r(); uint8_t tmic1_r();

View File

@ -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(0x112, 0x112).w(FUNC(v25_common_device::pmc2_w));
map(0x138, 0x138).r(FUNC(v25_common_device::pt_r)); map(0x138, 0x138).r(FUNC(v25_common_device::pt_r));
map(0x13b, 0x13b).w(FUNC(v25_common_device::pmt_w)); 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(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(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(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(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(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(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(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(0x190, 0x190).w(FUNC(v25_common_device::tmc0_w));
map(0x191, 0x191).w(FUNC(v25_common_device::tmc1_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(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(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)); 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) return (((m_pending_irq & source) ? 0x80 : 0x00)
| ((m_unmasked_irq & source) ? 0x00 : 0x40) | ((m_unmasked_irq & source) ? 0x00 : 0x40)
| ((m_macro_service & source) ? 0x20 : 0x00)
| ((m_bankswitch_irq & source) ? 0x10 : 0x00) | ((m_bankswitch_irq & source) ? 0x10 : 0x00)
| priority); | priority);
} }
@ -67,7 +81,12 @@ void v25_common_device::write_irqcontrol(int /*INTSOURCES*/ source, uint8_t d)
m_unmasked_irq |= source; m_unmasked_irq |= source;
if (BIT(d, 5)) if (BIT(d, 5))
{
logerror("%06x: Warning: macro service function not implemented\n",PC()); logerror("%06x: Warning: macro service function not implemented\n",PC());
m_macro_service |= source;
}
else
m_macro_service &= ~source;
if (BIT(d, 4)) if (BIT(d, 4))
m_bankswitch_irq |= source; 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); 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() uint8_t v25_common_device::exic0_r()
{ {
return read_irqcontrol(INTP0, m_priority_intp); return read_irqcontrol(INTP0, m_priority_intp);
@ -182,6 +223,118 @@ void v25_common_device::exic2_w(uint8_t d)
write_irqcontrol(INTP2, 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() uint16_t v25_common_device::tm0_r()
{ {
if (!machine().side_effects_disabled()) if (!machine().side_effects_disabled())
@ -285,6 +438,17 @@ void v25_common_device::tmc1_w(uint8_t d)
m_timers[2]->adjust(attotime::never); 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() uint8_t v25_common_device::tmic0_r()
{ {
return read_irqcontrol(INTTU0, m_priority_inttu); return read_irqcontrol(INTTU0, m_priority_inttu);