summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/h8/h8_dtc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/h8/h8_dtc.cpp')
-rw-r--r--src/devices/cpu/h8/h8_dtc.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/devices/cpu/h8/h8_dtc.cpp b/src/devices/cpu/h8/h8_dtc.cpp
index 8d51c067843..3dd276fca11 100644
--- a/src/devices/cpu/h8/h8_dtc.cpp
+++ b/src/devices/cpu/h8/h8_dtc.cpp
@@ -1,3 +1,6 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
+
#include "emu.h"
#include "h8_dtc.h"
@@ -26,7 +29,7 @@ const int h8_dtc_device::vector_to_enable[92] = {
-1, 40, 41, -1 // ERI2, RXI2, TXI2, TEI2
};
-h8_dtc_device::h8_dtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+h8_dtc_device::h8_dtc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
device_t(mconfig, H8_DTC, tag, owner, clock),
m_cpu(*this, finder_base::DUMMY_TAG),
m_intc(*this, finder_base::DUMMY_TAG)
@@ -36,37 +39,50 @@ h8_dtc_device::h8_dtc_device(const machine_config &mconfig, const char *tag, dev
void h8_dtc_device::device_start()
{
// TODO, probably need to kill the vectors
+ save_item(STRUCT_MEMBER(m_states, m_base));
+ save_item(STRUCT_MEMBER(m_states, m_sra));
+ save_item(STRUCT_MEMBER(m_states, m_dar));
+ save_item(STRUCT_MEMBER(m_states, m_cr));
+ save_item(STRUCT_MEMBER(m_states, m_incs));
+ save_item(STRUCT_MEMBER(m_states, m_incd));
+ save_item(STRUCT_MEMBER(m_states, m_count));
+ save_item(STRUCT_MEMBER(m_states, m_id));
+ save_item(STRUCT_MEMBER(m_states, m_next));
+
+ save_item(NAME(m_dtcer));
+ save_item(NAME(m_dtvecr));
+ save_item(NAME(m_cur_active_vector));
}
void h8_dtc_device::device_reset()
{
memset(m_dtcer, 0x00, sizeof(m_dtcer));
memset(m_states, 0, sizeof(m_states));
- for(uint8_t i=0; i<sizeof(m_states)/sizeof(m_states[0]); i++)
+ for(u8 i=0; i<sizeof(m_states)/sizeof(m_states[0]); i++)
m_states[i].m_id = i;
m_dtvecr = 0x00;
m_cur_active_vector = -1;
}
-uint8_t h8_dtc_device::dtcer_r(offs_t offset)
+u8 h8_dtc_device::dtcer_r(offs_t offset)
{
if(V>=2) logerror("dtcer_r %x, %02x\n", offset, m_dtcer[offset]);
return m_dtcer[offset];
}
-void h8_dtc_device::dtcer_w(offs_t offset, uint8_t data)
+void h8_dtc_device::dtcer_w(offs_t offset, u8 data)
{
m_dtcer[offset] = data;
if(V>=2) logerror("dtcer_w %x, %02x\n", offset, data);
}
-uint8_t h8_dtc_device::dtvecr_r()
+u8 h8_dtc_device::dtvecr_r()
{
if(V>=2) logerror("dtvecr_r %02x\n", m_dtvecr);
return m_dtvecr;
}
-void h8_dtc_device::dtvecr_w(uint8_t data)
+void h8_dtc_device::dtvecr_w(u8 data)
{
m_dtvecr = data;
if(V>=2) logerror("dtvecr_w %02x\n", data);
@@ -122,11 +138,11 @@ void h8_dtc_device::vector_done(int vector)
m_waiting_vector.erase(wi);
h8_dtc_state *state = m_states + vector;
- uint32_t sra = state->m_sra;
- uint32_t dar = state->m_dar;
- uint32_t cr = state->m_cr;
+ u32 sra = state->m_sra;
+ u32 dar = state->m_dar;
+ u32 cr = state->m_cr;
- uint32_t mode = sra & 0x0c000000;
+ u32 mode = sra & 0x0c000000;
if(V>=1) logerror("regs at %08x sra=%08x dar=%08x cr=%08x %s mode\n", state->m_base, sra, dar, cr,
mode == 0x00000000 || mode == 0x0c000000 ? "normal" : mode == 0x04000000 ? "repeat" : "block");
state->m_incs = sra & 0x80000000 ?
@@ -198,7 +214,6 @@ void h8_dtc_device::writeback_done(int vector)
m_intc->internal_interrupt(vector);
} else {
logerror("Software dtc done\n");
- exit(0);
}
}