diff options
Diffstat (limited to 'src/devices/cpu/m6502/xavix.cpp')
-rw-r--r-- | src/devices/cpu/m6502/xavix.cpp | 131 |
1 files changed, 58 insertions, 73 deletions
diff --git a/src/devices/cpu/m6502/xavix.cpp b/src/devices/cpu/m6502/xavix.cpp index 206c07bece5..70c60972512 100644 --- a/src/devices/cpu/m6502/xavix.cpp +++ b/src/devices/cpu/m6502/xavix.cpp @@ -33,28 +33,36 @@ DEFINE_DEVICE_TYPE(XAVIX, xavix_device, "xavix", "XaviX (SSD 97 / SSD 98)") xavix_device::xavix_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : m6502_device(mconfig, XAVIX, tag, owner, clock), XPC(0), - m_lowbus_config("lowbus", ENDIANNESS_LITTLE, 8, 15) + m_lowbus_config("lowbus", ENDIANNESS_LITTLE, 8, 15), + m_extbus_config("extbus", ENDIANNESS_LITTLE, 8, 24) { program_config.m_addr_width = 24; program_config.m_logaddr_width = 24; sprogram_config.m_addr_width = 24; sprogram_config.m_logaddr_width = 24; + // XaviX specific spaces m_lowbus_config.m_addr_width = 15; m_lowbus_config.m_logaddr_width = 15; + m_extbus_config.m_addr_width = 24; + m_extbus_config.m_logaddr_width = 24; } xavix_device::xavix_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : m6502_device(mconfig, type, tag, owner, clock), XPC(0), - m_lowbus_config("lowbus", ENDIANNESS_LITTLE, 8, 15) + m_lowbus_config("lowbus", ENDIANNESS_LITTLE, 8, 15), + m_extbus_config("extbus", ENDIANNESS_LITTLE, 8, 24) { program_config.m_addr_width = 24; program_config.m_logaddr_width = 24; sprogram_config.m_addr_width = 24; sprogram_config.m_logaddr_width = 24; + // XaviX specific spaces m_lowbus_config.m_addr_width = 15; m_lowbus_config.m_logaddr_width = 15; + m_extbus_config.m_addr_width = 24; + m_extbus_config.m_logaddr_width = 24; } @@ -83,6 +91,7 @@ void xavix_device::device_start() init(); m_lowbus_space = &space(5); + m_extbus_space = &space(6); state_add(XAVIX_DATABANK, "DATBNK", m_databank).callimport().formatstr("%2s");; state_add(XAVIX_CODEBANK, "CODBNK", m_codebank).callimport().formatstr("%2s"); @@ -95,24 +104,29 @@ void xavix_device::device_reset() m6502_device::device_reset(); } -// used by the xalda_idy ( lda ($**), y )opcodes -uint8_t xavix_device::read_special(uint16_t adr) +// used by the xalda_idy ( lda ($**), y )opcodes where databank value is used for high address bits +inline uint8_t xavix_device::read_special(uint16_t adr) { return read_full_data_sp(m_databank, adr); } -uint8_t xavix_device::read_full_special(uint32_t adr) +// used by DMA and video operations (and custom new opcodes) where full address is specified +uint8_t xavix_device::read_full_data_sp(uint32_t adr) { return read_full_data_sp((adr&0xff0000)>>16, adr&0xffff); } +void xavix_device::write_full_data_sp(uint32_t adr, uint8_t val) +{ + write_full_data_sp((adr&0xff0000)>>16, adr&0xffff, val); +} xavix_device::mi_xavix_normal::mi_xavix_normal(xavix_device *_base) { base = _base; } -uint8_t xavix_device::read_full_data(uint32_t addr) +inline uint8_t xavix_device::read_full_data(uint32_t addr) { return read_full_data((addr & 0xff0000)>>16, addr & 0xffff); } @@ -132,7 +146,7 @@ inline uint8_t xavix_device::read_full_data(uint8_t databank, uint16_t adr) } else { - return mintf->program->read_byte((databank << 16) | adr); + return m_extbus_space->read_byte((databank << 16) | adr); } } else @@ -146,7 +160,7 @@ inline uint8_t xavix_device::read_full_data(uint8_t databank, uint16_t adr) if ((adr & 0x7fff) >= 0x200) { - return mintf->program->read_byte((databank << 16) | adr); + return m_extbus_space->read_byte((databank << 16) | adr); } else { @@ -155,12 +169,12 @@ inline uint8_t xavix_device::read_full_data(uint8_t databank, uint16_t adr) } else { - return mintf->program->read_byte((databank << 16) | adr); + return m_extbus_space->read_byte((databank << 16) | adr); } } } -uint8_t xavix_device::read_full_data_sp(uint8_t databank, uint16_t adr) +inline uint8_t xavix_device::read_full_data_sp(uint8_t databank, uint16_t adr) { if (databank < 0x80) { @@ -175,79 +189,33 @@ uint8_t xavix_device::read_full_data_sp(uint8_t databank, uint16_t adr) } else { - return mintf->program->read_byte((databank << 16) | adr); + return m_extbus_space->read_byte((databank << 16) | adr); } } else { - return mintf->program->read_byte((databank << 16) | adr); + return m_extbus_space->read_byte((databank << 16) | adr); } } // data reads -uint8_t xavix_device::mi_xavix_normal::read(uint16_t adr) +inline uint8_t xavix_device::mi_xavix_normal::read(uint16_t adr) { uint8_t databank = base->get_databank(); return base->read_full_data(databank, adr); } -uint8_t xavix_device::read_full_code(uint32_t addr) -{ - return read_full_code(mintf->cache, (addr & 0xff0000)>>16, addr & 0xffff); -} - - -uint8_t xavix_device::read_full_code(memory_access_cache<0, 0, ENDIANNESS_LITTLE> * space, uint8_t codebank, uint16_t adr) -{ - if (codebank < 0x80) - { - if (adr < 0x8000) - { - return m_lowbus_space->read_byte(adr); - } - else - { - return space->read_byte(codebank << 16 | adr); - } - } - else - { - return space->read_byte(codebank << 16 | adr); - } -} - -uint8_t xavix_device::read_full_code(address_space* space, uint8_t codebank, uint16_t adr) -{ - if (codebank < 0x80) - { - if (adr < 0x8000) - { - return m_lowbus_space->read_byte(adr); - } - else - { - return space->read_byte(codebank << 16 | adr); - } - } - else - { - return space->read_byte(codebank << 16 | adr); - } -} - - // opcode reads uint8_t xavix_device::mi_xavix_normal::read_sync(uint16_t adr) { - uint8_t codebank = base->get_codebank(); - return base->read_full_code(scache, codebank, adr); + return scache->read_byte(base->adr_with_codebank(adr)); } +// oprand reads uint8_t xavix_device::mi_xavix_normal::read_arg(uint16_t adr) { - uint8_t codebank = base->get_codebank(); - return base->read_full_code(cache, codebank, adr); + return cache->read_byte(base->adr_with_codebank(adr)); } // data writes @@ -256,9 +224,8 @@ void xavix_device::write_full_data(uint32_t addr, uint8_t val) write_full_data((addr & 0xff0000)>>16, addr & 0xffff, val); } - // data writes -void xavix_device::write_full_data(uint8_t databank, uint16_t adr, uint8_t val) +inline void xavix_device::write_full_data(uint8_t databank, uint16_t adr, uint8_t val) { if (databank < 0x80) { @@ -279,7 +246,7 @@ void xavix_device::write_full_data(uint8_t databank, uint16_t adr, uint8_t val) } else { - mintf->program->write_byte((databank << 16) | adr, val); + m_extbus_space->write_byte((databank << 16) | adr, val); } } else @@ -299,7 +266,7 @@ void xavix_device::write_full_data(uint8_t databank, uint16_t adr, uint8_t val) if ((adr & 0x7fff) >= 0x200) { - mintf->program->write_byte((databank << 16) | adr, val); + m_extbus_space->write_byte((databank << 16) | adr, val); } else { @@ -308,11 +275,29 @@ void xavix_device::write_full_data(uint8_t databank, uint16_t adr, uint8_t val) } else { - mintf->program->write_byte((databank << 16) | adr, val); + m_extbus_space->write_byte((databank << 16) | adr, val); } } } +inline void xavix_device::write_full_data_sp(uint8_t databank, uint16_t adr, uint8_t val) +{ + if (databank < 0x80) + { + if (adr < 0x8000) + { + m_lowbus_space->write_byte(adr, val); + } + else + { + m_extbus_space->write_byte((databank << 16) | adr, val); + } + } + else + { + m_extbus_space->write_byte((databank << 16) | adr, val); + } +} void xavix_device::mi_xavix_normal::write(uint16_t adr, uint8_t val) { @@ -326,14 +311,12 @@ xavix_device::mi_xavix_nd::mi_xavix_nd(xavix_device *_base) : mi_xavix_normal(_b uint8_t xavix_device::mi_xavix_nd::read_sync(uint16_t adr) { - uint8_t codebank = base->get_codebank(); - return base->read_full_code(sprogram, codebank, adr); + return sprogram->read_byte(base->adr_with_codebank(adr)); } uint8_t xavix_device::mi_xavix_nd::read_arg(uint16_t adr) { - uint8_t codebank = base->get_codebank(); - return base->read_full_code(program, codebank, adr); + return program->read_byte(base->adr_with_codebank(adr)); } void xavix_device::set_codebank(uint8_t bank) @@ -366,12 +349,14 @@ device_memory_interface::space_config_vector xavix_device::memory_space_config() return space_config_vector { std::make_pair(AS_PROGRAM, &program_config), std::make_pair(AS_OPCODES, &sprogram_config), - std::make_pair(5, &m_lowbus_config) + std::make_pair(5, &m_lowbus_config), + std::make_pair(6, &m_extbus_config) }; else return space_config_vector { std::make_pair(AS_PROGRAM, &program_config), - std::make_pair(5, &m_lowbus_config) + std::make_pair(5, &m_lowbus_config), + std::make_pair(6, &m_extbus_config) }; } |