diff options
Diffstat (limited to 'src/devices/cpu/m6502/r65c19.h')
-rw-r--r-- | src/devices/cpu/m6502/r65c19.h | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/devices/cpu/m6502/r65c19.h b/src/devices/cpu/m6502/r65c19.h new file mode 100644 index 00000000000..7c53a74ecc4 --- /dev/null +++ b/src/devices/cpu/m6502/r65c19.h @@ -0,0 +1,165 @@ +// license:BSD-3-Clause +// copyright-holders:AJR + +#ifndef MAME_CPU_M6502_R65C19_H +#define MAME_CPU_M6502_R65C19_H + +#pragma once + +#include "r65c02.h" + +class r65c19_device : public r65c02_device +{ +public: + enum { + R65C19_W = M6502_IR + 1, + R65C19_WL, + R65C19_WH, + R65C19_I + }; + + r65c19_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + r65c19_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor internal_map); + + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; + + virtual void do_exec_full() override; + virtual void do_exec_partial() override; + + virtual u16 get_irq_vector(); + + void c19_init(); + + u8 cir_r(); + void cir_w(u8 data); + u8 page1_seg_r(offs_t offset); + void page1_seg_w(offs_t offset, u8 data); + +private: + void do_add(u8 v); + u16 do_accumulate(u16 v, u16 w); + +#define O(o) void o ## _full(); void o ## _partial() + + O(adc_ipx); + O(add_imm); + O(add_zpg); + O(add_zpx); + O(and_ipx); + O(asr_acc); + O(bar_amr); + O(bas_amr); + O(brk_r_imp); + O(clw_imp); + O(cmp_ipx); + O(eor_ipx); + O(exc_zpx); + O(ini_imp); + O(jpi_ind); + O(jsb_vec); + O(jmp_r_ind); + O(jsr_r_adr); + O(lab_acc); + O(lai_imp); + O(lan_imp); + O(lda_ipx); + O(lii_imp); + O(mpa_imp); + O(mpy_imp); + O(neg_acc); + O(nxt_imp); + O(ora_ipx); + O(phi_imp); + O(phw_imp); + O(pia_imp); + O(pli_imp); + O(plw_imp); + O(psh_imp); + O(pul_imp); + O(rba_ima); + O(rnd_imp); + O(rts_r_imp); + O(sba_ima); + O(sbc_ipx); + O(sta_ipx); + O(sti_imz); + O(taw_imp); + O(tip_imp); + O(twa_imp); + O(reset_r); + +#undef O + + u16 m_w; + u16 m_i; + + optional_shared_ptr<u8> m_page1_ram; + u8 m_cir; +}; + +class c39_device : public r65c19_device +{ +public: + enum { + C39_BSR0 = R65C19_I + 1, + C39_BSR1, C39_BSR2, C39_BSR3, C39_BSR4, C39_BSR5, C39_BSR6, C39_BSR7 + }; + +protected: + c39_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor internal_map); + + virtual space_config_vector memory_space_config() const override; + + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + + u8 pbs_r(); + void pbs_w(u8 data); + u8 bsr_r(offs_t offset); + void bsr_w(offs_t offset, u8 data); + u8 expansion_r(offs_t offset); + void expansion_w(offs_t offset, u8 data); + +private: + class mi_banked : public memory_interface { + public: + virtual u8 read(u16 adr) override; + virtual u8 read_sync(u16 adr) override; + virtual u8 read_arg(u16 adr) override; + virtual void write(u16 adr, u8 val) override; + + u8 exp_read(u16 adr); + u8 exp_read_cached(u16 adr); + void exp_write(u16 adr, u8 val); + u8 es4_read(u16 adr); + void es4_write(u16 adr, u8 val); + + memory_access<21, 0, 0, ENDIANNESS_LITTLE>::cache escache; + memory_access<21, 0, 0, ENDIANNESS_LITTLE>::specific exp; + memory_access< 9, 0, 0, ENDIANNESS_LITTLE>::specific es4; + + u8 bsr[8]; + u8 pbs; + }; + + address_space_config m_exp_config; + address_space_config m_es4_config; +}; + +class l2800_device : public c39_device +{ +public: + l2800_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +private: + void internal_map(address_map &map) ATTR_COLD; +}; + +DECLARE_DEVICE_TYPE(R65C19, r65c19_device) +DECLARE_DEVICE_TYPE(L2800, l2800_device) + +#endif // MAME_CPU_M6502_R65C19_H |