diff options
Diffstat (limited to 'src/devices/cpu/m6502/xavix.h')
-rw-r--r-- | src/devices/cpu/m6502/xavix.h | 50 |
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 { |