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.cpp102
1 files changed, 50 insertions, 52 deletions
diff --git a/src/devices/cpu/m6502/xavix.cpp b/src/devices/cpu/m6502/xavix.cpp
index 522d9374b5f..bf5eb25b925 100644
--- a/src/devices/cpu/m6502/xavix.cpp
+++ b/src/devices/cpu/m6502/xavix.cpp
@@ -34,28 +34,16 @@
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_extbus_config("extbus", ENDIANNESS_LITTLE, 8, 24)
+ xavix_device(mconfig, XAVIX, tag, owner, clock)
{
- 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_extbus_config("extbus", ENDIANNESS_LITTLE, 8, 24)
+ m_extbus_config("extbus", ENDIANNESS_LITTLE, 8, 24),
+ m_vector_callback(*this)
{
program_config.m_addr_width = 24;
program_config.m_logaddr_width = 24;
@@ -83,13 +71,10 @@ offs_t xavix_device::pc_to_external(u16 pc)
void xavix_device::device_start()
{
- if(cache_disabled)
- mintf = std::make_unique<mi_xavix_nd>(this);
- else
- mintf = std::make_unique<mi_xavix_normal>(this);
+ mintf = std::make_unique<mi_xavix>(this);
// bind delegates
- m_vector_callback.bind_relative_to(*owner());
+ m_vector_callback.resolve();
init();
@@ -116,29 +101,57 @@ void xavix_device::device_reset()
-xavix_device::mi_xavix_normal::mi_xavix_normal(xavix_device *_base)
+xavix_device::mi_xavix::mi_xavix(xavix_device *_base)
{
base = _base;
}
-void xavix_device::write_special_stack(uint8_t data)
+void xavix_device::write_special_stack(uint32_t addr, uint8_t data)
{
- m_special_stack[m_special_stackpos&0xff] = data;
+ if (m_use_private_stack_for_extra_callf_byte)
+ {
+ m_special_stack[m_special_stackpos & 0xff] = data;
+ }
+ else
+ {
+ write_stack(addr, data);
+ }
}
void xavix_device::dec_special_stack()
{
- m_special_stackpos--;
+ if (m_use_private_stack_for_extra_callf_byte)
+ {
+ m_special_stackpos--;
+ }
+ else
+ {
+ dec_SP();
+ }
}
void xavix_device::inc_special_stack()
{
- m_special_stackpos++;
+ if (m_use_private_stack_for_extra_callf_byte)
+ {
+ m_special_stackpos++;
+ }
+ else
+ {
+ inc_SP();
+ }
}
-uint8_t xavix_device::read_special_stack()
+uint8_t xavix_device::read_special_stack(uint32_t addr)
{
- return m_special_stack[m_special_stackpos&0xff];
+ if (m_use_private_stack_for_extra_callf_byte)
+ {
+ return m_special_stack[m_special_stackpos & 0xff];
+ }
+ else
+ {
+ return read_stack(addr);
+ }
}
@@ -167,32 +180,32 @@ inline uint8_t xavix_device::read_full_data(uint8_t databank, uint16_t adr)
}
else
{
- return m_extbus_space->read_byte((databank << 16) | adr);
+ return m_extbus_space->read_byte(((databank << 16) | adr) & 0x7fffff );
}
}
else
{
- return m_extbus_space->read_byte((databank << 16) | adr);
+ return m_extbus_space->read_byte(((databank << 16) | adr) & 0x7fffff );
}
}
// data reads
-inline uint8_t xavix_device::mi_xavix_normal::read(uint16_t adr)
+inline uint8_t xavix_device::mi_xavix::read(uint16_t adr)
{
uint8_t databank = base->get_databank();
return base->read_full_data(databank, adr);
}
// opcode reads
-uint8_t xavix_device::mi_xavix_normal::read_sync(uint16_t adr)
+uint8_t xavix_device::mi_xavix::read_sync(uint16_t adr)
{
- return scache->read_byte(base->adr_with_codebank(adr));
+ return csprogram.read_byte(base->adr_with_codebank(adr));
}
// oprand reads
-uint8_t xavix_device::mi_xavix_normal::read_arg(uint16_t adr)
+uint8_t xavix_device::mi_xavix::read_arg(uint16_t adr)
{
- return cache->read_byte(base->adr_with_codebank(adr));
+ return cprogram.read_byte(base->adr_with_codebank(adr));
}
// data writes
@@ -272,35 +285,21 @@ inline void xavix_device::write_full_data(uint8_t databank, uint16_t adr, uint8_
}
else
{
- m_extbus_space->write_byte((databank << 16) | adr, val);
+ m_extbus_space->write_byte(((databank << 16) | adr) & 0x7fffff, val);
}
}
else
{
- m_extbus_space->write_byte((databank << 16) | adr, val);
+ m_extbus_space->write_byte(((databank << 16) | adr) & 0x7fffff, val);
}
}
-void xavix_device::mi_xavix_normal::write(uint16_t adr, uint8_t val)
+void xavix_device::mi_xavix::write(uint16_t adr, uint8_t val)
{
uint8_t databank = base->get_databank();
base->write_full_data(databank, adr, val);
}
-xavix_device::mi_xavix_nd::mi_xavix_nd(xavix_device *_base) : mi_xavix_normal(_base)
-{
-}
-
-uint8_t xavix_device::mi_xavix_nd::read_sync(uint16_t adr)
-{
- return sprogram->read_byte(base->adr_with_codebank(adr));
-}
-
-uint8_t xavix_device::mi_xavix_nd::read_arg(uint16_t adr)
-{
- return program->read_byte(base->adr_with_codebank(adr));
-}
-
void xavix_device::set_codebank(uint8_t bank)
{
// space().write_byte(0xfe, bank);
@@ -374,5 +373,4 @@ void xavix_device::state_string_export(const device_state_entry &entry, std::str
-
#include "cpu/m6502/xavix.hxx"