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