1 // license:BSD-3-Clause
2 // copyright-holders:Karl Stenerud
3 #ifndef MAME_CPU_SPC700_SPC700_H
4 #define MAME_CPU_SPC700_SPC700_H
5 
6 #pragma once
7 
8 
9 class spc700_device : public cpu_device
10 {
11 public:
12 	// construction/destruction
13 	spc700_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
14 
15 protected:
16 	// construction/destruction
17 	spc700_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_map = address_map_constructor());
18 
19 	// device-level overrides
20 	virtual void device_start() override;
21 	virtual void device_reset() override;
22 
23 	// device_execute_interface overrides
execute_min_cycles()24 	virtual uint32_t execute_min_cycles() const noexcept override { return 2; }
execute_max_cycles()25 	virtual uint32_t execute_max_cycles() const noexcept override { return 8; }
execute_input_lines()26 	virtual uint32_t execute_input_lines() const noexcept override { return 1; }
execute_input_edge_triggered(int inputnum)27 	virtual bool execute_input_edge_triggered(int inputnum) const noexcept override { return inputnum == INPUT_LINE_NMI; }
28 	virtual void execute_run() override;
29 	virtual void execute_set_input(int inputnum, int state) override;
30 
31 	// device_memory_interface overrides
32 	virtual space_config_vector memory_space_config() const override;
33 
34 	// device_state_interface overrides
35 	virtual void state_import(const device_state_entry &entry) override;
36 	virtual void state_export(const device_state_entry &entry) override;
37 	virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
38 
39 	// device_disasm_interface overrides
40 	virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
41 
42 	address_space_config m_program_config;
43 private:
44 	uint32_t m_a;     /* Accumulator */
45 	uint32_t m_x;     /* Index Register X */
46 	uint32_t m_y;     /* Index Register Y */
47 	uint32_t m_s;     /* Stack Pointer */
48 	uint32_t m_pc;    /* Program Counter */
49 	uint32_t m_ppc;   /* Previous Program Counter */
50 	uint32_t m_flag_n;    /* Negative Flag */
51 	uint32_t m_flag_z;    /* Zero flag */
52 	uint32_t m_flag_v;    /* Overflow Flag */
53 	uint32_t m_flag_p;    /* Direct Page Flag */
54 	uint32_t m_flag_b;    /* BRK Instruction Flag */
55 	uint32_t m_flag_h;    /* Half-carry Flag */
56 	uint32_t m_flag_i;    /* Interrupt Mask Flag */
57 	uint32_t m_flag_c;    /* Carry Flag */
58 	uint32_t m_line_irq;  /* Status of the IRQ line */
59 	uint32_t m_line_nmi;  /* Status of the NMI line */
60 	uint32_t m_line_rst;  /* Status of the RESET line */
61 	uint32_t m_ir;        /* Instruction Register */
62 	address_space *m_program;
63 	uint32_t m_stopped;   /* stopped status */
64 	int m_ICount;
65 	uint32_t m_source;
66 	uint32_t m_destination;
67 	uint32_t m_temp1;
68 	uint32_t m_temp2;
69 	uint32_t m_temp3;
70 	short m_spc_int16;
71 	int m_spc_int32;
72 
73 	uint32_t m_debugger_temp;
74 
75 	inline uint32_t read_8_normal(uint32_t address);
76 	inline uint32_t read_8_immediate(uint32_t address);
77 	inline uint32_t read_8_instruction(uint32_t address);
78 	inline uint32_t read_8_direct(uint32_t address);
79 	inline void write_8_normal(uint32_t address, uint32_t value);
80 	inline void write_8_direct(uint32_t address, uint32_t value);
81 	inline uint32_t read_16_normal(uint32_t address);
82 	inline uint32_t read_16_immediate(uint32_t address);
83 	inline uint32_t read_16_direct(uint32_t address);
84 	inline void write_16_direct(uint32_t address, uint32_t value);
85 	inline uint32_t EA_IMM();
86 	inline uint32_t EA_IMM16();
87 	inline uint32_t EA_ABS();
88 	inline uint32_t EA_ABX();
89 	inline uint32_t EA_ABY();
90 	inline uint32_t EA_AXI();
91 	inline uint32_t EA_DP();
92 	inline uint32_t EA_DPX();
93 	inline uint32_t EA_DPY();
94 	inline uint32_t EA_DXI();
95 	inline uint32_t EA_DIY();
96 	inline uint32_t EA_XI();
97 	inline uint32_t EA_XII();
98 	inline uint32_t EA_YI();
99 	inline void JUMP(uint32_t address);
100 	inline void BRANCH(uint32_t offset);
101 	inline void SET_REG_YA(uint32_t value);
102 	inline void SET_REG_P(uint32_t value);
103 	inline void PUSH_8(uint32_t value);
104 	inline uint32_t PULL_8();
105 	inline void PUSH_16(uint32_t value);
106 	inline uint32_t PULL_16();
107 	inline void CHECK_IRQ();
108 	inline void SET_FLAG_I(uint32_t value);
109 	void SERVICE_IRQ();
110 };
111 
112 
113 DECLARE_DEVICE_TYPE(SPC700, spc700_device)
114 
115 
116 /* ======================================================================== */
117 /* ============================= Configuration ============================ */
118 /* ======================================================================== */
119 
120 /* Turn on optimizations for SNES since it doesn't hook up the interrupt lines */
121 #define SPC700_OPTIMIZE_SNES 1
122 
123 
124 /* ======================================================================== */
125 /* ============================== PROTOTYPES ============================== */
126 /* ======================================================================== */
127 
128 enum
129 {
130 	SPC700_PC=1, SPC700_S, SPC700_P, SPC700_A, SPC700_X, SPC700_Y
131 };
132 
133 #define SPC700_INT_NONE         0
134 #define SPC700_INT_IRQ          1
135 #define SPC700_INT_NMI          2
136 
137 
138 /* ======================================================================== */
139 /* ============================== END OF FILE ============================= */
140 /* ======================================================================== */
141 
142 #endif // MAME_CPU_SPC700_SPC700_H
143