diff options
Diffstat (limited to 'src/devices/cpu/m6502/m6502.h')
-rw-r--r-- | src/devices/cpu/m6502/m6502.h | 94 |
1 files changed, 51 insertions, 43 deletions
diff --git a/src/devices/cpu/m6502/m6502.h b/src/devices/cpu/m6502/m6502.h index b6034d98f0a..112630dfd50 100644 --- a/src/devices/cpu/m6502/m6502.h +++ b/src/devices/cpu/m6502/m6502.h @@ -11,6 +11,9 @@ #ifndef MAME_CPU_M6502_M6502_H #define MAME_CPU_M6502_M6502_H +#pragma once + + class m6502_device : public cpu_device { public: enum { @@ -20,24 +23,13 @@ public: V_LINE = INPUT_LINE_IRQ0 + 16 }; - m6502_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - bool get_sync() const { return sync; } - void disable_cache() { cache_disabled = true; } - - auto sync_cb() { return sync_w.bind(); } - - devcb_write_line sync_w; - -protected: - m6502_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - class memory_interface { public: - address_space *program, *sprogram; - memory_access_cache<0, 0, ENDIANNESS_LITTLE> *cache, *scache; + memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache cprogram, csprogram; + memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific program; + memory_access<14, 0, 0, ENDIANNESS_LITTLE>::specific program14; - virtual ~memory_interface() {} + virtual ~memory_interface() = default; virtual uint8_t read(uint16_t adr) = 0; virtual uint8_t read_9(uint16_t adr); virtual uint8_t read_sync(uint16_t adr) = 0; @@ -46,20 +38,41 @@ protected: virtual void write_9(uint16_t adr, uint8_t val); }; - class mi_default_normal : public memory_interface { + m6502_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + void set_address_width(int width, bool custom_interface) { + program_config.m_addr_width = width; + sprogram_config.m_addr_width = width; + uses_custom_memory_interface = custom_interface; + } + + void set_custom_memory_interface(std::unique_ptr<memory_interface> interface) { + mintf = std::move(interface); + } + + bool get_sync() const { return sync; } + + auto sync_cb() { return sync_w.bind(); } + + devcb_write_line sync_w; + +protected: + m6502_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + class mi_default : public memory_interface { public: - virtual ~mi_default_normal() {} + virtual ~mi_default() = default; virtual uint8_t read(uint16_t adr) override; virtual uint8_t read_sync(uint16_t adr) override; virtual uint8_t read_arg(uint16_t adr) override; virtual void write(uint16_t adr, uint8_t val) override; }; - class mi_default_nd : public mi_default_normal { + class mi_default14 : public mi_default { public: - virtual ~mi_default_nd() {} - virtual uint8_t read_sync(uint16_t adr) override; - virtual uint8_t read_arg(uint16_t adr) override; + virtual ~mi_default14() = default; + virtual uint8_t read(uint16_t adr) override; + virtual void write(uint16_t adr, uint8_t val) override; }; enum { @@ -81,16 +94,16 @@ protected: virtual void init(); // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; // device_execute_interface overrides - virtual uint32_t execute_min_cycles() const override; - virtual uint32_t execute_max_cycles() const override; - virtual uint32_t execute_input_lines() const override; + virtual bool cpu_is_interruptible() const override { return true; } + virtual uint32_t execute_min_cycles() const noexcept override; + virtual uint32_t execute_max_cycles() const noexcept override; virtual void execute_run() override; virtual void execute_set_input(int inputnum, int state) override; - virtual bool execute_input_edge_triggered(int inputnum) const override; + virtual bool execute_input_edge_triggered(int inputnum) const noexcept override; // device_memory_interface overrides virtual space_config_vector memory_space_config() const override; @@ -116,23 +129,24 @@ protected: uint8_t Y; /* Y index register */ uint8_t P; /* Processor status */ uint8_t IR; /* Prefetched instruction register */ - int inst_state_base; /* Current instruction bank */ + int inst_state_base; /* Current instruction bank */ std::unique_ptr<memory_interface> mintf; int inst_state, inst_substate; int icount, bcount, count_before_instruction_step; bool nmi_state, irq_state, apu_irq_state, v_state; - bool irq_taken, sync, cache_disabled, inhibit_interrupts; + bool nmi_pending, irq_taken, sync, inhibit_interrupts; + bool uses_custom_memory_interface; uint8_t read(uint16_t adr) { return mintf->read(adr); } uint8_t read_9(uint16_t adr) { return mintf->read_9(adr); } void write(uint16_t adr, uint8_t val) { mintf->write(adr, val); } void write_9(uint16_t adr, uint8_t val) { mintf->write_9(adr, val); } uint8_t read_arg(uint16_t adr) { return mintf->read_arg(adr); } - uint8_t read_pc() { return mintf->read_arg(PC++); } - uint8_t read_pc_noinc() { return mintf->read_arg(PC); } - void prefetch(); - void prefetch_noirq(); + uint8_t read_pc() { return mintf->read_arg(PC); } + void prefetch_start(); + void prefetch_end(); + void prefetch_end_noirq(); void set_nz(uint8_t v); u32 XPC; @@ -265,16 +279,9 @@ protected: #undef O }; -class m6502_mcu_device : public m6502_device { -protected: - m6502_mcu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - - void internal_update() { internal_update(total_cycles()); } - virtual void internal_update(uint64_t current_time) = 0; - void recompute_bcount(uint64_t event_time); - static void add_event(uint64_t &event_time, uint64_t new_event); - - virtual void execute_run() override; +class m6512_device : public m6502_device { +public: + m6512_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; enum { @@ -294,5 +301,6 @@ enum { }; DECLARE_DEVICE_TYPE(M6502, m6502_device) +DECLARE_DEVICE_TYPE(M6512, m6512_device) #endif // MAME_CPU_M6502_M6502_H |