summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/clipper/clipper.h
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2016-12-27 11:24:33 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2016-12-27 11:24:33 +0700
commitf4f7d659a1e7461ec1ef33534a61df8fe1dc1ee3 (patch)
treeb634eeb368c79c8c6b73944a67ea0d07cc93b3fb /src/devices/cpu/clipper/clipper.h
parent47a690bef71e27f72d5b0f86c6308d8a16539a21 (diff)
initial commit
Diffstat (limited to 'src/devices/cpu/clipper/clipper.h')
-rw-r--r--src/devices/cpu/clipper/clipper.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/devices/cpu/clipper/clipper.h b/src/devices/cpu/clipper/clipper.h
new file mode 100644
index 00000000000..ad8c28421a1
--- /dev/null
+++ b/src/devices/cpu/clipper/clipper.h
@@ -0,0 +1,165 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+#pragma once
+
+#ifndef __CLIPPER_H__
+#define __CLIPPER_H__
+
+// enumerate registers (why?)
+enum
+{
+ CLIPPER_R0, CLIPPER_R1, CLIPPER_R2, CLIPPER_R3, CLIPPER_R4, CLIPPER_R5, CLIPPER_R6, CLIPPER_R7,
+ CLIPPER_R8, CLIPPER_R9, CLIPPER_R10, CLIPPER_R11, CLIPPER_R12, CLIPPER_R13, CLIPPER_R14, CLIPPER_R15,
+
+ CLIPPER_F0, CLIPPER_F1, CLIPPER_F2, CLIPPER_F3, CLIPPER_F4, CLIPPER_F5, CLIPPER_F6, CLIPPER_F7,
+ CLIPPER_F8, CLIPPER_F9, CLIPPER_F10, CLIPPER_F11, CLIPPER_F12, CLIPPER_F13, CLIPPER_F14, CLIPPER_F15,
+
+ CLIPPER_PSW, CLIPPER_SSW,
+ CLIPPER_PC
+};
+
+enum
+{
+ ADDR_MODE_NONE = 0x00,
+ ADDR_MODE_PC32 = 0x10,
+ ADDR_MODE_ABS32 = 0x30,
+ ADDR_MODE_REL32 = 0x60,
+ ADDR_MODE_PC16 = 0x90,
+ ADDR_MODE_REL12 = 0xA0,
+ ADDR_MODE_ABS16 = 0xB0,
+ ADDR_MODE_PCX = 0xD0,
+ ADDR_MODE_RELX = 0xE0,
+ ADDR_MODE_REL = 0xFF
+};
+
+// branch conditions
+enum
+{
+ BRANCH_T = 0x0,
+ BRANCH_GT = 0x1,
+ BRANCH_GE = 0x2,
+ BRANCH_EQ = 0x3,
+ BRANCH_LT = 0x4,
+ BRANCH_LE = 0x5,
+ BRANCH_NE = 0x6,
+ BRANCH_GTU = 0x7,
+ BRANCH_GEU = 0x8,
+ BRANCH_LTU = 0x9,
+ BRANCH_LEU = 0xA,
+ BRANCH_V = 0xB,
+ BRANCH_NV = 0xC,
+ BRANCH_N = 0xD,
+ BRANCH_NN = 0xE,
+ BRANCH_FV = 0xF
+};
+
+class clipper_device : public cpu_device
+{
+public:
+ clipper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // 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; }; // FIXME: don't know, especially macro instructions
+ virtual uint32_t execute_input_lines() const override { return 16; }; // FIXME: number of input/interrupt lines
+ virtual void execute_run() override;
+ virtual void execute_set_input(int inputnum, int state) override;
+
+ // device_memory_interface overrides
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
+
+ // device_state_interface overrides
+#if 0
+ virtual void state_import(const device_state_entry &entry) override;
+ virtual void state_export(const device_state_entry &entry) override;
+#endif
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
+
+ // device_disasm_interface overrides
+ virtual uint32_t disasm_min_opcode_bytes() const override { return 2; } // smallest instruction
+ virtual uint32_t disasm_max_opcode_bytes() const override { return 8; } // largest instruction
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+
+ // core registers
+ uint32_t m_pc;
+ union {
+ struct {
+ uint32_t n : 1; // negative
+ uint32_t z : 1; // zero
+ uint32_t v : 1; // overflow
+ uint32_t c : 1; // carry out or borrow in
+ uint32_t fx : 1; // floating inexact
+ uint32_t fu : 1; // floating underflow
+ uint32_t fd : 1; // floating divide by zero
+ uint32_t fv : 1; // floating overflow
+ uint32_t fi : 1; // floating invalid operation
+ uint32_t efx : 1; // enable floating inexact trap
+ uint32_t efu : 1; // enable floating underflow trap
+ uint32_t efd : 1; // enable floating divide by zero trap
+ uint32_t efv : 1; // enable floating overflow trap
+ uint32_t efi : 1; // enable floating invalid operation trap
+ uint32_t eft : 1; // enable floating trap
+ uint32_t fr : 2; // floating rounding mode
+ uint32_t : 3;
+ uint32_t dsp : 2; // c400 - delay slot pointer
+ uint32_t big : 1; // c400 - big endian (hardware)
+ uint32_t t : 1; // trace trap
+ uint32_t cts : 4; // cpu trap status
+ uint32_t mts : 4; // memory trap status
+ } bits;
+ uint32_t d;
+ } m_psw;
+ union {
+ struct {
+ uint32_t in : 4; // interrupt number
+ uint32_t il : 4; // interrupt level
+ uint32_t ei : 1; // enable interrupts
+ uint32_t id : 8; // cpu rev # and type
+ uint32_t : 5;
+ uint32_t frd : 1; // floating registers dirty
+ uint32_t tp : 1; // trace trap pending
+ uint32_t ecm : 1; // enable corrected memory error
+ uint32_t df : 1; // fpu disabled
+ uint32_t m : 1; // mapped mode
+ uint32_t ku : 1; // user protect key
+ uint32_t uu : 1; // user data mode
+ uint32_t k : 1; // protect key
+ uint32_t u : 1; // user mode
+ uint32_t p : 1; // previous mode
+ } bits;
+ uint32_t d;
+ } m_ssw;
+ int32_t m_r[2][16];
+ double m_f[16];
+
+private:
+ address_space_config m_program_config;
+
+ address_space *m_program;
+ direct_read_data *m_direct;
+
+ int m_icount;
+ int m_interrupt_cycles;
+
+ int m_immediate_irq;
+ int m_immediate_vector;
+
+ int clipper_device::execute_instruction(uint16_t insn);
+
+ // condition code evaluations
+ void clipper_device::evaluate_cc1(int32_t v0);
+ void clipper_device::evaluate_cc2(int32_t v0, int32_t v1);
+ void clipper_device::evaluate_cc3(int32_t v0, int32_t v1, int32_t v2);
+ void clipper_device::evaluate_cc2f(double v0, double v1);
+ bool clipper_device::evaluate_branch(uint32_t r2);
+
+ uint32_t clipper_device::intrap(uint32_t vector, uint32_t pc);
+};
+
+extern const device_type CLIPPER;
+#endif /* __CLIPPER_H__ */