diff options
Diffstat (limited to 'src/devices/cpu/h8/h8_dtc.cpp')
-rw-r--r-- | src/devices/cpu/h8/h8_dtc.cpp | 37 |
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); } } |