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