summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/ns32081.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/ns32081.h')
-rw-r--r--src/devices/machine/ns32081.h114
1 files changed, 90 insertions, 24 deletions
diff --git a/src/devices/machine/ns32081.h b/src/devices/machine/ns32081.h
index 4097494c830..12a50d9434d 100644
--- a/src/devices/machine/ns32081.h
+++ b/src/devices/machine/ns32081.h
@@ -6,55 +6,121 @@
#pragma once
-#include "cpu/ns32000/slave.h"
+#include "cpu/ns32000/common.h"
-class ns32081_device
+class ns32081_device_base
: public device_t
- , public ns32000_slave_interface
+ , public ns32000_fpu_interface
{
-public:
- ns32081_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
-
- virtual void state_add(device_state_interface &parent, int &index) override;
-
- virtual u16 read_st(int *icount = nullptr) override;
- virtual u16 read_op() override;
-
- virtual void write_id(u16 data) override;
- virtual void write_op(u16 data) override;
-
protected:
- // device_t overrides
+ ns32081_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock);
+
+ // device_t implementation
virtual void device_start() override;
virtual void device_reset() override;
+ // ns32000_slave_interface implementation
+ virtual void state_add(device_state_interface &parent, int &index) override;
+
+ // slave interface handlers
+ template <typename T> T read();
+ template <typename T> void write(T data);
+
+ // execution helpers
+ bool decode(u8 const idbyte, u16 const opword);
void execute();
- void complete(void *buf, s32 param);
+ u16 status(int *icount);
+ void complete(s32 param);
+
+ // register helpers
+ virtual void reg_get(unsigned const op_size, u64 &op_value, unsigned const reg) const = 0;
+ virtual void reg_set(unsigned const reg, unsigned const op_size, u64 const op_value) = 0;
private:
emu_timer *m_complete;
- // registers
- u32 m_fsr;
- u32 m_f[8];
+ u32 m_fsr; // floating-point status register
// operating state
+ u32 m_state;
u8 m_idbyte;
u16 m_opword;
struct operand
{
- unsigned expected;
- unsigned issued;
+ u32 expected;
+ u32 issued;
u64 value;
}
m_op[3];
u16 m_status;
+ u32 m_tcy;
+};
+
+class ns32081_device
+ : public ns32081_device_base
+ , public ns32000_slow_slave_interface
+{
+public:
+ ns32081_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
+
+ // ns32000_slave_interface implementation
+ virtual void state_add(device_state_interface &parent, int &index) override;
+
+ // ns32000_slow_slave_interface implementation
+ virtual u16 slow_status(int *icount = nullptr) override { return status(icount); }
+ virtual u16 slow_read() override { return read<u16>(); }
+ virtual void slow_write(u16 data) override { write<u16>(data); }
- // implementation state
- unsigned m_state;
- unsigned m_tcy;
+protected:
+ // device_t implementation
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // register helpers
+ virtual void reg_get(unsigned const op_size, u64 &op_value, unsigned const reg) const override;
+ virtual void reg_set(unsigned const reg, unsigned const op_size, u64 const op_value) override;
+
+private:
+ // registers
+ u32 m_f[8];
+};
+
+class ns32381_device
+ : public ns32081_device_base
+ , public ns32000_slow_slave_interface
+ , public ns32000_fast_slave_interface
+{
+public:
+ ns32381_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
+
+ // ns32000_slave_interface implementation
+ virtual void state_add(device_state_interface &parent, int &index) override;
+
+ // ns32000_slow_slave_interface implementation
+ virtual u16 slow_status(int *icount = nullptr) override { return status(icount); }
+ virtual u16 slow_read() override { return read<u16>(); }
+ virtual void slow_write(u16 data) override { write<u16>(data); }
+
+ // ns32000_fast_slave_interface implementation
+ virtual u32 fast_status(int *icount = nullptr) override { return status(icount); }
+ virtual u32 fast_read() override { return read<u32>(); }
+ virtual void fast_write(u32 data) override { write<u32>(data); }
+
+protected:
+ // device_t implementation
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // register helpers
+ virtual void reg_get(unsigned const op_size, u64 &op_value, unsigned const reg) const override;
+ virtual void reg_set(unsigned const reg, unsigned const op_size, u64 const op_value) override;
+
+private:
+ // registers
+ u64 m_l[8];
};
DECLARE_DEVICE_TYPE(NS32081, ns32081_device)
+DECLARE_DEVICE_TYPE(NS32381, ns32381_device)
#endif // MAME_MACHINE_NS32081_H