summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m6502/xavix.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/m6502/xavix.h')
-rw-r--r--src/devices/cpu/m6502/xavix.h50
1 files changed, 20 insertions, 30 deletions
diff --git a/src/devices/cpu/m6502/xavix.h b/src/devices/cpu/m6502/xavix.h
index 89f97f574bd..5363bb77d36 100644
--- a/src/devices/cpu/m6502/xavix.h
+++ b/src/devices/cpu/m6502/xavix.h
@@ -135,22 +135,11 @@ public:
- typedef device_delegate<int16_t (int which, int half)> xavix_interrupt_vector_delegate;
-
- template <typename Object> void set_vector_callback(Object &&cb) { m_vector_callback = std::forward<Object>(cb); }
- void set_vector_callback(xavix_interrupt_vector_delegate callback) { m_vector_callback = callback; }
- template <class FunctionClass> void set_vector_callback(const char *devname, int16_t (FunctionClass::*callback)(int, int), const char *name)
- {
- set_vector_callback(xavix_interrupt_vector_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr)));
- }
- template <class FunctionClass> void set_vector_callback(int16_t (FunctionClass::*callback)(int, int), const char *name)
- {
- set_vector_callback(xavix_interrupt_vector_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
- }
-
-
#undef O
+ typedef device_delegate<int16_t (int which, int half)> xavix_interrupt_vector_delegate;
+
+ template <typename... T> void set_vector_callback(T &&... args) { m_vector_callback.set(std::forward<T>(args)...); }
uint8_t read_full_data(uint8_t databank, uint16_t addr);
uint8_t read_full_data(uint32_t addr);
@@ -158,12 +147,12 @@ public:
void write_full_data(uint32_t addr, uint8_t val);
protected:
- class mi_xavix_normal : public memory_interface {
+ class mi_xavix : public memory_interface {
public:
xavix_device *base;
- mi_xavix_normal(xavix_device *base);
- virtual ~mi_xavix_normal() {}
+ mi_xavix(xavix_device *base);
+ virtual ~mi_xavix() {}
virtual uint8_t read(uint16_t adr) override;
virtual uint8_t read_sync(uint16_t adr) override;
@@ -171,15 +160,6 @@ protected:
virtual void write(uint16_t adr, uint8_t val) override;
};
- class mi_xavix_nd : public mi_xavix_normal {
- public:
- mi_xavix_nd(xavix_device *base);
- virtual ~mi_xavix_nd() {}
-
- virtual uint8_t read_sync(uint16_t adr) override;
- virtual uint8_t read_arg(uint16_t adr) override;
- };
-
uint8_t m_databank;
uint8_t m_codebank;
uint32_t XPC;
@@ -188,8 +168,8 @@ protected:
uint32_t adr_with_codebank(uint16_t adr) { return adr | (get_codebank() << 16); }
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
virtual offs_t pc_to_external(u16 pc) override;
virtual void state_import(const device_state_entry &entry) override;
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
@@ -212,10 +192,10 @@ protected:
void set_databank(uint8_t bank);
uint8_t get_databank();
- void write_special_stack(uint8_t data);
+ void write_special_stack(uint32_t addr, uint8_t data);
void dec_special_stack();
void inc_special_stack();
- uint8_t read_special_stack();
+ uint8_t read_special_stack(uint32_t addr);
/* we store the additional 'codebank' used for far calls in a different, private stack
this seems to be neccessary for 'rad_hnt2' not to crash when bringing up the calibration / score table screens
@@ -231,6 +211,16 @@ protected:
uint8_t read_zeropage(uint32_t addr);
void write_zeropage(uint32_t addr, uint8_t val);
+ // Some original XaviX games seemed to suggest that the extra byte of the far calls went to a different
+ // stack, but dblmouse on suprtvpc does direct stack manipulation which challenges this assumption.
+ // It could be a SuperXaviX vs XaviX differences however, so currently leaving this as a toggle for testing.
+ //
+ // pausing in rad_hnt2 (press shift when on the map) is broken without this logic as the stack becomes too
+ // big with the extra bytes
+ //
+ // we currently use the private stack for regular XaviX but not for the later CPUs, however the root cause
+ // of needing it for regular XaviX could be somewhere else
+ bool m_use_private_stack_for_extra_callf_byte = true;
};
enum {