diff options
Diffstat (limited to 'src/devices/cpu/se3208/se3208.cpp')
-rw-r--r-- | src/devices/cpu/se3208/se3208.cpp | 98 |
1 files changed, 38 insertions, 60 deletions
diff --git a/src/devices/cpu/se3208/se3208.cpp b/src/devices/cpu/se3208/se3208.cpp index a8d2381c0da..6e5a15bef2c 100644 --- a/src/devices/cpu/se3208/se3208.cpp +++ b/src/devices/cpu/se3208/se3208.cpp @@ -53,7 +53,7 @@ se3208_device::se3208_device(const machine_config &mconfig, const char *tag, dev , m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0) , m_machinex_cb(*this) , m_iackx_cb(*this) - , m_PC(0), m_SR(0), m_SP(0), m_ER(0), m_PPC(0), m_program(nullptr), m_cache(nullptr), m_IRQ(0), m_NMI(0), m_icount(0) + , m_PC(0), m_SR(0), m_SP(0), m_ER(0), m_PPC(0), m_IRQ(0), m_NMI(0), m_icount(0) { } @@ -72,88 +72,66 @@ void se3208_device::device_resolve_objects() } -uint32_t se3208_device::read_dword_unaligned(address_space &space, uint32_t address) +uint8_t se3208_device::SE3208_Read8(uint32_t address) { - if (DWORD_ALIGNED(address)) - return space.read_dword(address); - else - { - osd_printf_debug("%08x: dword READ unaligned %08x\n", m_PC, address); -#if ALLOW_UNALIGNED_DWORD_ACCESS - return space.read_byte(address) | space.read_byte(address + 1) << 8 | space.read_byte(address + 2) << 16 | space.read_byte(address + 3) << 24; -#else - return 0; -#endif - } + return m_program.read_byte(address); } -uint16_t se3208_device::read_word_unaligned(address_space &space, uint32_t address) +uint16_t se3208_device::SE3208_Read16(uint32_t address) { if (!WORD_ALIGNED(address)) - return space.read_byte(address) | space.read_byte(address+1)<<8; + return m_program.read_byte(address) | m_program.read_byte(address+1)<<8; else - return space.read_word(address); + return m_program.read_word(address); } -void se3208_device::write_dword_unaligned(address_space &space, uint32_t address, uint32_t data) +uint32_t se3208_device::SE3208_Read32(uint32_t address) { if (DWORD_ALIGNED(address)) - space.write_dword(address, data); + return m_program.read_dword(address); else { + osd_printf_debug("%08x: dword READ unaligned %08x\n", m_PC, address); #if ALLOW_UNALIGNED_DWORD_ACCESS - space.write_byte(address, data & 0xff); - space.write_byte(address + 1, (data >> 8) & 0xff); - space.write_byte(address + 2, (data >> 16) & 0xff); - space.write_byte(address + 3, (data >> 24) & 0xff); + return m_program.read_byte(address) | m_program.read_byte(address + 1) << 8 | m_program.read_byte(address + 2) << 16 | m_program.read_byte(address + 3) << 24; +#else + return 0; #endif - osd_printf_debug("%08x: dword WRITE unaligned %08x\n", m_PC, address); } +} +void se3208_device::SE3208_Write8(uint32_t address,uint8_t data) +{ + m_program.write_byte(address,data); } -void se3208_device::write_word_unaligned(address_space &space, uint32_t address, uint16_t data) +void se3208_device::SE3208_Write16(uint32_t address,uint16_t data) { if (!WORD_ALIGNED(address)) { - space.write_byte(address, data & 0xff); - space.write_byte(address+1, (data>>8)&0xff); + m_program.write_byte(address, data & 0xff); + m_program.write_byte(address+1, (data>>8)&0xff); } else { - space.write_word(address, data); + m_program.write_word(address, data); } } - -uint8_t se3208_device::SE3208_Read8(uint32_t addr) -{ - return m_program->read_byte(addr); -} - -uint16_t se3208_device::SE3208_Read16(uint32_t addr) +void se3208_device::SE3208_Write32(uint32_t address, uint32_t data) { - return read_word_unaligned(*m_program,addr); -} - -uint32_t se3208_device::SE3208_Read32(uint32_t addr) -{ - return read_dword_unaligned(*m_program,addr); -} - -void se3208_device::SE3208_Write8(uint32_t addr,uint8_t val) -{ - m_program->write_byte(addr,val); -} - -void se3208_device::SE3208_Write16(uint32_t addr,uint16_t val) -{ - write_word_unaligned(*m_program,addr,val); -} - -void se3208_device::SE3208_Write32(uint32_t addr,uint32_t val) -{ - write_dword_unaligned(*m_program,addr,val); + if (DWORD_ALIGNED(address)) + m_program.write_dword(address, data); + else + { +#if ALLOW_UNALIGNED_DWORD_ACCESS + m_program.write_byte(address, data & 0xff); + m_program.write_byte(address + 1, (data >> 8) & 0xff); + m_program.write_byte(address + 2, (data >> 16) & 0xff); + m_program.write_byte(address + 3, (data >> 24) & 0xff); +#endif + osd_printf_debug("%08x: dword WRITE unaligned %08x\n", m_PC, address); + } } @@ -1732,8 +1710,8 @@ void se3208_device::device_reset() m_SP = 0; m_ER = 0; m_PPC = 0; - m_program = &space(AS_PROGRAM); - m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>(); + space(AS_PROGRAM).cache(m_cache); + space(AS_PROGRAM).specific(m_program); m_PC=SE3208_Read32(0); m_SR=0; m_IRQ=CLEAR_LINE; @@ -1777,7 +1755,7 @@ void se3208_device::execute_run() { do { - uint16_t Opcode=m_cache->read_word(m_PC, WORD_XOR_LE(0)); + uint16_t Opcode=m_cache.read_word(m_PC, WORD_XOR_LE(0)); m_PPC = m_PC; debugger_instruction_hook(m_PC); @@ -1802,8 +1780,8 @@ void se3208_device::device_start() { BuildTable(); - m_program = &space(AS_PROGRAM); - m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>(); + space(AS_PROGRAM).cache(m_cache); + space(AS_PROGRAM).specific(m_program); save_item(NAME(m_R)); save_item(NAME(m_PC)); |