diff options
Diffstat (limited to 'src/devices/cpu/unsp/unsp.h')
-rw-r--r-- | src/devices/cpu/unsp/unsp.h | 97 |
1 files changed, 72 insertions, 25 deletions
diff --git a/src/devices/cpu/unsp/unsp.h b/src/devices/cpu/unsp/unsp.h index 1a42d68ed02..b7b72a3cf5a 100644 --- a/src/devices/cpu/unsp/unsp.h +++ b/src/devices/cpu/unsp/unsp.h @@ -32,7 +32,7 @@ #define SINGLE_INSTRUCTION_MODE (0) -#define ENABLE_UNSP_DRC (1) +#define ENABLE_UNSP_DRC (0) #define UNSP_LOG_OPCODES (0) #define UNSP_LOG_REGS (0) @@ -60,13 +60,17 @@ enum UNSP_IRQ_EN, UNSP_FIQ_EN, - UNSP_IRQ, - UNSP_FIQ, -#if UNSP_LOG_OPCODES || UNSP_LOG_REGS + UNSP_FIR_MOV_EN, UNSP_SB, + UNSP_AQ, + UNSP_FRA, + UNSP_BNK, + UNSP_INE, +#if UNSP_LOG_OPCODES || UNSP_LOG_REGS + UNSP_PRI, UNSP_LOG_OPS #else - UNSP_SB + UNSP_PRI #endif }; @@ -95,11 +99,16 @@ public: unsp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual ~unsp_device(); + void set_vectorbase(uint16_t vector) { m_vectorbase = vector; } + uint8_t get_csb(); void set_ds(uint16_t ds); uint16_t get_ds(); + void set_fr(uint16_t fr); + uint16_t get_fr(); + inline void ccfunc_unimplemented(); void invalidate_cache(); @@ -109,18 +118,19 @@ public: void cfunc_log_write(); #endif + void cfunc_muls(); + protected: unsp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal); // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - virtual void device_stop() override; + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual void device_stop() override ATTR_COLD; // device_execute_interface overrides - virtual uint32_t execute_min_cycles() const override { return 5; } - virtual uint32_t execute_max_cycles() const override { return 5; } - virtual uint32_t execute_input_lines() const override { return 0; } + virtual uint32_t execute_min_cycles() const noexcept override { return 5; } + virtual uint32_t execute_max_cycles() const noexcept override { return 5; } virtual void execute_run() override; virtual void execute_set_input(int inputnum, int state) override; @@ -149,7 +159,12 @@ protected: REG_R4, REG_BP, REG_SR, - REG_PC + REG_PC, + + REG_SR1 = 0, + REG_SR2, + REG_SR3, + REG_SR4 }; /* internal compiler state */ @@ -164,15 +179,25 @@ protected: struct internal_unsp_state { - uint32_t m_r[8]; + uint32_t m_r[16]; // required to be 32 bits due to DRC + uint32_t m_secbank[4]; uint32_t m_enable_irq; uint32_t m_enable_fiq; - uint32_t m_irq; + uint32_t m_fir_move; uint32_t m_fiq; - uint32_t m_curirq; + uint32_t m_irq; uint32_t m_sirq; uint32_t m_sb; - uint32_t m_saved_sb[3]; + uint32_t m_aq; + uint32_t m_fra; + uint32_t m_bnk; + uint32_t m_ine; + uint32_t m_pri; + + uint32_t m_divq_bit; + uint32_t m_divq_dividend; + uint32_t m_divq_divisor; + uint32_t m_divq_a; uint32_t m_arg0; uint32_t m_arg1; @@ -185,14 +210,14 @@ protected: internal_unsp_state* m_core; protected: - uint16_t read16(uint32_t address) { return m_program->read_word(address); } + uint16_t read16(uint32_t address) { return m_program.read_word(address); } void write16(uint32_t address, uint16_t data) { #if UNSP_LOG_REGS log_write(address, data); #endif - m_program->write_word(address, data); + m_program.write_word(address, data); } void add_lpc(const int32_t offset) @@ -210,13 +235,15 @@ protected: virtual void execute_fxxx_101_group(uint16_t op); void execute_fxxx_110_group(uint16_t op); void execute_fxxx_111_group(uint16_t op); - void execute_fxxx_group(uint16_t op);; + void execute_fxxx_group(uint16_t op); void execute_fxxx_100_group(uint16_t op); virtual void execute_extended_group(uint16_t op); virtual void execute_exxx_group(uint16_t op); + void execute_muls_ss(const uint16_t rd, const uint16_t rs, const uint16_t size); void unimplemented_opcode(uint16_t op); void unimplemented_opcode(uint16_t op, uint16_t ximm); void unimplemented_opcode(uint16_t op, uint16_t ximm, uint16_t ximm_2); + virtual bool op_is_divq(const uint16_t op) { return false; } int m_iso; @@ -230,6 +257,10 @@ protected: void push(uint32_t value, uint32_t *reg); uint16_t pop(uint32_t *reg); + void update_nz(uint32_t value); + void update_nzsc(uint32_t value, uint16_t r0, uint16_t r1); + bool do_basic_alu_ops(const uint16_t& op0, uint32_t& lres, uint16_t& r0, uint16_t& r1, uint32_t& r2, bool update_flags); + private: // compilation boundaries -- how far back/forward does the analysis extend? enum : uint32_t @@ -257,22 +288,19 @@ private: address_space_config m_program_config; - address_space *m_program; - std::function<u16 (offs_t)> m_pr16; - std::function<const void * (offs_t)> m_prptr; + memory_access<23, 1, -1, ENDIANNESS_BIG>::cache m_cache; + memory_access<23, 1, -1, ENDIANNESS_BIG>::specific m_program; uint32_t m_debugger_temp; #if UNSP_LOG_OPCODES || UNSP_LOG_REGS uint32_t m_log_ops; #endif - void update_nz(uint32_t value); - void update_nzsc(uint32_t value, uint16_t r0, uint16_t r1); inline void trigger_fiq(); inline void trigger_irq(int line); void check_irqs(); - drc_cache m_cache; + drc_cache m_drccache; std::unique_ptr<drcuml_state> m_drcuml; std::unique_ptr<unsp_frontend> m_drcfe; uint32_t m_drcoptions; @@ -290,6 +318,7 @@ private: uml::code_handle *m_mem_write; bool m_enable_drc; + uint16_t m_vectorbase; void execute_run_drc(); void flush_drc_cache(); @@ -319,6 +348,8 @@ private: #if UNSP_LOG_REGS FILE *m_log_file; #endif +protected: + int m_numregs; }; @@ -345,6 +376,8 @@ protected: virtual void execute_fxxx_101_group(uint16_t op) override; virtual void execute_exxx_group(uint16_t op) override; + void execute_divq(uint16_t op); + bool op_is_divq(const uint16_t op) override; virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; }; @@ -361,7 +394,21 @@ protected: virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; virtual void execute_extended_group(uint16_t op) override; + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + private: + enum + { + UNSP20_R8 = 0, + UNSP20_R9, + UNSP20_R10, + UNSP20_R11, + UNSP20_R12, + UNSP20_R13, + UNSP20_R14, + UNSP20_R15 + }; }; |