summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m6502/xavix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/m6502/xavix.cpp')
-rw-r--r--src/devices/cpu/m6502/xavix.cpp131
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)
};
}