summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mips/sonyvu.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mips/sonyvu.h')
-rw-r--r--src/devices/cpu/mips/sonyvu.h209
1 files changed, 209 insertions, 0 deletions
diff --git a/src/devices/cpu/mips/sonyvu.h b/src/devices/cpu/mips/sonyvu.h
new file mode 100644
index 00000000000..17536c24fe5
--- /dev/null
+++ b/src/devices/cpu/mips/sonyvu.h
@@ -0,0 +1,209 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/******************************************************************************
+*
+* Sony Playstation 2 Vector Unit device skeleton
+*
+* To Do:
+* Everything
+*
+*/
+
+#ifndef MAME_CPU_MIPS_SONYVU_H
+#define MAME_CPU_MIPS_SONYVU_H
+
+#pragma once
+
+enum
+{
+ SONYVU_TPC,
+ SONYVU_SF,
+ SONYVU_MF,
+ SONYVU_CF,
+ SONYVU_R,
+ SONYVU_I,
+ SONYVU_Q,
+ SONYVU_ACCx, SONYVU_ACCy, SONYVU_ACCz, SONYVU_ACCw,
+ SONYVU_VF00x, SONYVU_VF00y, SONYVU_VF00z, SONYVU_VF00w,
+ SONYVU_VF01x, SONYVU_VF01y, SONYVU_VF01z, SONYVU_VF01w,
+ SONYVU_VF02x, SONYVU_VF02y, SONYVU_VF02z, SONYVU_VF02w,
+ SONYVU_VF03x, SONYVU_VF03y, SONYVU_VF03z, SONYVU_VF03w,
+ SONYVU_VF04x, SONYVU_VF04y, SONYVU_VF04z, SONYVU_VF04w,
+ SONYVU_VF05x, SONYVU_VF05y, SONYVU_VF05z, SONYVU_VF05w,
+ SONYVU_VF06x, SONYVU_VF06y, SONYVU_VF06z, SONYVU_VF06w,
+ SONYVU_VF07x, SONYVU_VF07y, SONYVU_VF07z, SONYVU_VF07w,
+ SONYVU_VF08x, SONYVU_VF08y, SONYVU_VF08z, SONYVU_VF08w,
+ SONYVU_VF09x, SONYVU_VF09y, SONYVU_VF09z, SONYVU_VF09w,
+ SONYVU_VF10x, SONYVU_VF10y, SONYVU_VF10z, SONYVU_VF10w,
+ SONYVU_VF11x, SONYVU_VF11y, SONYVU_VF11z, SONYVU_VF11w,
+ SONYVU_VF12x, SONYVU_VF12y, SONYVU_VF12z, SONYVU_VF12w,
+ SONYVU_VF13x, SONYVU_VF13y, SONYVU_VF13z, SONYVU_VF13w,
+ SONYVU_VF14x, SONYVU_VF14y, SONYVU_VF14z, SONYVU_VF14w,
+ SONYVU_VF15x, SONYVU_VF15y, SONYVU_VF15z, SONYVU_VF15w,
+ SONYVU_VF16x, SONYVU_VF16y, SONYVU_VF16z, SONYVU_VF16w,
+ SONYVU_VF17x, SONYVU_VF17y, SONYVU_VF17z, SONYVU_VF17w,
+ SONYVU_VF18x, SONYVU_VF18y, SONYVU_VF18z, SONYVU_VF18w,
+ SONYVU_VF19x, SONYVU_VF19y, SONYVU_VF19z, SONYVU_VF19w,
+ SONYVU_VF20x, SONYVU_VF20y, SONYVU_VF20z, SONYVU_VF20w,
+ SONYVU_VF21x, SONYVU_VF21y, SONYVU_VF21z, SONYVU_VF21w,
+ SONYVU_VF22x, SONYVU_VF22y, SONYVU_VF22z, SONYVU_VF22w,
+ SONYVU_VF23x, SONYVU_VF23y, SONYVU_VF23z, SONYVU_VF23w,
+ SONYVU_VF24x, SONYVU_VF24y, SONYVU_VF24z, SONYVU_VF24w,
+ SONYVU_VF25x, SONYVU_VF25y, SONYVU_VF25z, SONYVU_VF25w,
+ SONYVU_VF26x, SONYVU_VF26y, SONYVU_VF26z, SONYVU_VF26w,
+ SONYVU_VF27x, SONYVU_VF27y, SONYVU_VF27z, SONYVU_VF27w,
+ SONYVU_VF28x, SONYVU_VF28y, SONYVU_VF28z, SONYVU_VF28w,
+ SONYVU_VF29x, SONYVU_VF29y, SONYVU_VF29z, SONYVU_VF29w,
+ SONYVU_VF30x, SONYVU_VF30y, SONYVU_VF30z, SONYVU_VF30w,
+ SONYVU_VF31x, SONYVU_VF31y, SONYVU_VF31z, SONYVU_VF31w,
+ SONYVU_VI00, SONYVU_VI01, SONYVU_VI02, SONYVU_VI03,
+ SONYVU_VI04, SONYVU_VI05, SONYVU_VI06, SONYVU_VI07,
+ SONYVU_VI08, SONYVU_VI09, SONYVU_VI10, SONYVU_VI11,
+ SONYVU_VI12, SONYVU_VI13, SONYVU_VI14, SONYVU_VI15,
+
+ SONYVU0_VPU_STAT,
+ SONYVU0_FBRST,
+ SONYVU0_CMSAR0,
+ SONYVU0_CMSAR1,
+
+ SONYVU1_P = SONYVU0_VPU_STAT
+};
+
+class sonyvu_device : public cpu_device
+{
+public:
+ // construction/destruction
+ virtual ~sonyvu_device() {}
+
+ void write_vu_mem(uint32_t address, uint32_t data);
+ void write_micro_mem(uint32_t address, uint64_t data);
+ float* vector_regs() { return m_v; }
+
+protected:
+ enum chip_type
+ {
+ CHIP_TYPE_VU0,
+ CHIP_TYPE_VU1,
+ };
+
+ sonyvu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor micro_cons, address_map_constructor vu_cons, chip_type chiptype, uint32_t mem_size);
+
+ enum : uint64_t
+ {
+ OP_UPPER_I = 0x8000000000000000ULL,
+ OP_UPPER_E = 0x4000000000000000ULL,
+ OP_UPPER_M = 0x2000000000000000ULL,
+ OP_UPPER_D = 0x1000000000000000ULL,
+ OP_UPPER_T = 0x0800000000000000ULL
+ };
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_execute_interface overrides
+ virtual uint32_t execute_min_cycles() const override { return 1; }
+ virtual uint32_t execute_max_cycles() const override { return 1; }
+ virtual uint32_t execute_input_lines() const override { return 0; }
+ virtual void execute_run() override;
+ virtual void execute_set_input(int inputnum, int state) override { }
+
+ // device_memory_interface overrides
+ virtual space_config_vector memory_space_config() const override;
+
+ // device_state_interface overrides
+ virtual void state_import(const device_state_entry &entry) override;
+ virtual void state_export(const device_state_entry &entry) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
+
+ // device_disasm_interface overrides
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+ void execute_upper(const uint32_t op);
+ void execute_lower(const uint32_t op);
+
+ // address spaces
+ const address_space_config m_micro_config;
+ const address_space_config m_vu_config;
+ address_space *m_micro_space;
+ address_space *m_vu_space;
+
+ // core registers
+ uint32_t m_mem_size;
+ uint32_t m_mem_mask;
+ required_shared_ptr<uint64_t> m_micro_mem;
+ required_shared_ptr<uint32_t> m_vu_mem;
+ float* m_vfmem;
+ uint32_t* m_vimem;
+
+ float m_vfr[32][4]; // 0..3 = x..w
+ uint32_t m_vcr[16];
+ float m_acc[4];
+
+ float* m_v;
+
+ uint32_t m_status_flag;
+ uint32_t m_mac_flag;
+ uint32_t m_clip_flag;
+ uint32_t m_r;
+ float m_i;
+ float m_q;
+
+ uint32_t m_pc;
+ bool m_running;
+
+ int m_icount;
+};
+
+class sonyvu1_device : public sonyvu_device
+{
+public:
+ sonyvu1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
+
+ void micro_map(address_map &map);
+ void vu_map(address_map &map);
+
+ float m_p;
+};
+
+class sonyvu0_device : public sonyvu_device
+{
+public:
+ template <typename T>
+ sonyvu0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&vu1_tag)
+ : sonyvu0_device(mconfig, tag, owner, clock)
+ {
+ m_vu1.set_tag(std::forward<T>(vu1_tag));
+ }
+
+ sonyvu0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ void micro_map(address_map &map);
+ void vu_map(address_map &map);
+
+ DECLARE_READ32_MEMBER(vu1_reg_r);
+ DECLARE_WRITE32_MEMBER(vu1_reg_w);
+
+ required_device<sonyvu1_device> m_vu1;
+
+ float* m_vu1_regs;
+ uint32_t m_control;
+ uint32_t m_vpu_stat;
+ uint32_t m_cmsar0;
+ uint32_t m_cmsar1;
+};
+
+DECLARE_DEVICE_TYPE(SONYVU1, sonyvu1_device)
+DECLARE_DEVICE_TYPE(SONYVU0, sonyvu0_device)
+
+#endif // MAME_CPU_MIPS_SONYVU_H \ No newline at end of file