summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m6502/m6502.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/m6502/m6502.h')
-rw-r--r--src/devices/cpu/m6502/m6502.h94
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