diff options
author | 2017-05-19 11:30:17 +0700 | |
---|---|---|
committer | 2017-05-19 11:30:17 +0700 | |
commit | 625ad44d4a990411f7271cf3e2c14d3ff956526f (patch) | |
tree | 9e74fdf88cd390b0655854fabd1bb89e96865523 /src/devices/cpu/clipper/clipper.h | |
parent | 09e7f997fbc74e491b36d5ec513de7137c7cdabe (diff) | |
parent | a0a9c3259048f880e01f065439a4dac5c228ce44 (diff) |
Merge remote-tracking branch 'refs/remotes/mamedev/master' into interpro
Diffstat (limited to 'src/devices/cpu/clipper/clipper.h')
-rw-r--r-- | src/devices/cpu/clipper/clipper.h | 345 |
1 files changed, 159 insertions, 186 deletions
diff --git a/src/devices/cpu/clipper/clipper.h b/src/devices/cpu/clipper/clipper.h index 6d63b8bc9dc..c94cfdac747 100644 --- a/src/devices/cpu/clipper/clipper.h +++ b/src/devices/cpu/clipper/clipper.h @@ -8,208 +8,180 @@ #include <limits.h> -enum clipper_registers -{ - 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 clipper_addressing_modes +class clipper_device : public cpu_device { - 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, -}; + enum registers + { + 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, -// branch conditions -enum clipper_branch_conditions -{ - BRANCH_T = 0x0, - BRANCH_LT = 0x1, - BRANCH_LE = 0x2, - BRANCH_EQ = 0x3, - BRANCH_GT = 0x4, - BRANCH_GE = 0x5, - BRANCH_NE = 0x6, - BRANCH_LTU = 0x7, - BRANCH_LEU = 0x8, - BRANCH_GTU = 0x9, - BRANCH_GEU = 0xa, - BRANCH_V = 0xb, - BRANCH_NV = 0xc, - BRANCH_N = 0xd, - BRANCH_NN = 0xe, - BRANCH_FN = 0xf, -}; + 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, -enum clipper_psw -{ - PSW_N = 0x00000001, // negative - PSW_Z = 0x00000002, // zero - PSW_V = 0x00000004, // overflow - PSW_C = 0x00000008, // carry out or borrow in - PSW_FX = 0x00000010, // floating inexact - PSW_FU = 0x00000020, // floating underflow - PSW_FD = 0x00000040, // floating divide by zero - PSW_FV = 0x00000080, // floating overflow - PSW_FI = 0x00000100, // floating invalid operation - PSW_EFX = 0x00000200, // enable floating inexact trap - PSW_EFU = 0x00000400, // enable floating underflow trap - PSW_EFD = 0x00000800, // enable floating divide by zero trap - PSW_EFV = 0x00001000, // enable floating overflow trap - PSW_EFI = 0x00002000, // enable floating invalid operation trap - PSW_EFT = 0x00004000, // enable floating trap - PSW_FR = 0x00018000, // floating rounding mode (2 bits) - // unused (3 bits) - PSW_DSP = 0x00300000, // c400 - delay slot pointer (2 bits) - PSW_BIG = 0x00400000, // c400 - big endian (hardware) - PSW_T = 0x00800000, // trace trap - PSW_CTS = 0x0f000000, // cpu trap status (4 bits) - PSW_MTS = 0xf0000000, // memory trap status (4 bits) -}; + CLIPPER_PSW, + CLIPPER_SSW, + CLIPPER_PC, + }; -enum clipper_ssw -{ - SSW_IN = 0x0000000f, // interrupt number (4 bits) - SSW_IL = 0x000000f0, // interrupt level (4 bits) - SSW_EI = 0x00000100, // enable interrupts - SSW_ID = 0x0001fe00, // cpu rev # and type (8 bits) + enum addressing_modes + { + 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, + }; + + // branch conditions + enum branch_conditions + { + BRANCH_T = 0x0, + BRANCH_LT = 0x1, + BRANCH_LE = 0x2, + BRANCH_EQ = 0x3, + BRANCH_GT = 0x4, + BRANCH_GE = 0x5, + BRANCH_NE = 0x6, + BRANCH_LTU = 0x7, + BRANCH_LEU = 0x8, + BRANCH_GTU = 0x9, + BRANCH_GEU = 0xa, + BRANCH_V = 0xb, + BRANCH_NV = 0xc, + BRANCH_N = 0xd, + BRANCH_NN = 0xe, + BRANCH_FN = 0xf, + }; + + enum psw + { + PSW_N = 0x00000001, // negative + PSW_Z = 0x00000002, // zero + PSW_V = 0x00000004, // overflow + PSW_C = 0x00000008, // carry out or borrow in + PSW_FX = 0x00000010, // floating inexact + PSW_FU = 0x00000020, // floating underflow + PSW_FD = 0x00000040, // floating divide by zero + PSW_FV = 0x00000080, // floating overflow + PSW_FI = 0x00000100, // floating invalid operation + PSW_EFX = 0x00000200, // enable floating inexact trap + PSW_EFU = 0x00000400, // enable floating underflow trap + PSW_EFD = 0x00000800, // enable floating divide by zero trap + PSW_EFV = 0x00001000, // enable floating overflow trap + PSW_EFI = 0x00002000, // enable floating invalid operation trap + PSW_EFT = 0x00004000, // enable floating trap + PSW_FR = 0x00018000, // floating rounding mode (2 bits) + // unused (3 bits) + PSW_DSP = 0x00300000, // c400 - delay slot pointer (2 bits) + PSW_BIG = 0x00400000, // c400 - big endian (hardware) + PSW_T = 0x00800000, // trace trap + PSW_CTS = 0x0f000000, // cpu trap status (4 bits) + PSW_MTS = 0xf0000000, // memory trap status (4 bits) + }; + + enum clipper_ssw + { + SSW_IN = 0x0000000f, // interrupt number (4 bits) + SSW_IL = 0x000000f0, // interrupt level (4 bits) + SSW_EI = 0x00000100, // enable interrupts + SSW_ID = 0x0001fe00, // cpu rev # and type (8 bits) // unused (5 bits) - SSW_FRD = 0x00400000, // floating registers dirty - SSW_TP = 0x00800000, // trace trap pending - SSW_ECM = 0x01000000, // enabled corrected memory error - SSW_DF = 0x02000000, // fpu disabled - SSW_M = 0x04000000, // mapped mode - SSW_KU = 0x08000000, // user protect key - SSW_UU = 0x10000000, // user data mode - SSW_K = 0x20000000, // protect key - SSW_U = 0x40000000, // user mode - SSW_P = 0x80000000, // previous mode -}; - -enum clipper_exception_vectors -{ - // data memory trap group - EXCEPTION_D_CORRECTED_MEMORY_ERROR = 0x108, - EXCEPTION_D_UNCORRECTABLE_MEMORY_ERROR = 0x110, - EXCEPTION_D_ALIGNMENT_FAULT = 0x120, - EXCEPTION_D_PAGE_FAULT = 0x128, - EXCEPTION_D_READ_PROTECT_FAULT = 0x130, - EXCEPTION_D_WRITE_PROTECT_FAULT = 0x138, - - // floating-point arithmetic trap group - EXCEPTION_FLOATING_INEXACT = 0x180, - EXCEPTION_FLOATING_UNDERFLOW = 0x188, - EXCEPTION_FLOATING_DIVIDE_BY_ZERO = 0x190, - EXCEPTION_FLOATING_OVERFLOW = 0x1a0, - EXCEPTION_FLOATING_INVALID_OPERATION = 0x1c0, - - // integer arithmetic trap group - EXCEPTION_INTEGER_DIVIDE_BY_ZERO = 0x208, - - // instruction memory trap group - EXCEPTION_I_CORRECTED_MEMORY_ERROR = 0x288, - EXCEPTION_I_UNCORRECTABLE_MEMORY_ERROR = 0x290, - EXCEPTION_I_ALIGNMENT_FAULT = 0x2a0, - EXCEPTION_I_PAGE_FAULT = 0x2a8, - EXCEPTION_I_EXECUTE_PROTECT_FAULT = 0x2b0, - - // illegal operation trap group - EXCEPTION_ILLEGAL_OPERATION = 0x300, - EXCEPTION_PRIVILEGED_INSTRUCTION = 0x308, - - // diagnostic trap group - EXCEPTION_TRACE = 0x380, - - // supervisor calls (0x400-0x7f8) - EXCEPTION_SUPERVISOR_CALL_BASE = 0x400, - - // prioritized interrupts (0x800-0xff8) - EXCEPTION_INTERRUPT_BASE = 0x800, -}; - -// trap source values are shifted into the correct field in the psw -enum clipper_cpu_trap_sources -{ - CTS_NO_CPU_TRAP = 0 << 24, - CTS_DIVIDE_BY_ZERO = 2 << 24, - CTS_ILLEGAL_OPERATION = 4 << 24, - CTS_PRIVILEGED_INSTRUCTION = 5 << 24, - CTS_TRACE_TRAP = 7 << 24, -}; - -enum clipper_memory_trap_sources -{ - MTS_NO_MEMORY_TRAP = 0 << 28, - MTS_CORRECTED_MEMORY_ERROR = 1 << 28, - MTS_UNCORRECTABLE_MEMORY_ERROR = 2 << 28, - MTS_ALIGNMENT_FAULT = 4 << 28, - MTS_PAGE_FAULT = 5 << 28, - MTS_READ_OR_EXECUTE_PROTECT_FAULT = 6 << 28, - MTS_WRITE_PROTECT_FAULT = 7 << 28, -}; - -// convenience macros for frequently used instruction fields -#define R1 (m_info.r1) -#define R2 (m_info.r2) - -// convenience macros for dealing with the psw -#define PSW(mask) (m_psw & PSW_##mask) -#define SSW(mask) (m_ssw & SSW_##mask) - -// macros for setting psw condition codes -#define FLAGS(C,V,Z,N) \ - m_psw = (m_psw & ~(PSW_C | PSW_V | PSW_Z | PSW_N)) | (((C) << 3) | ((V) << 2) | ((Z) << 1) | ((N) << 0)); -#define FLAGS_CV(C,V) \ - m_psw = (m_psw & ~(PSW_C | PSW_V)) | (((C) << 3) | ((V) << 2)); -#define FLAGS_ZN(Z,N) \ - m_psw = (m_psw & ~(PSW_Z | PSW_N)) | (((Z) << 1) | ((N) << 0)); - -// over/underflow for addition/subtraction from here: http://stackoverflow.com/questions/199333/how-to-detect-integer-overflow-in-c-c -#define OF_ADD(a, b) ((b > 0) && (a > INT_MAX - b)) -#define UF_ADD(a, b) ((b < 0) && (a < INT_MIN - b)) -#define OF_SUB(a, b) ((b < 0) && (a > INT_MAX + b)) -#define UF_SUB(a, b) ((b > 0) && (a < INT_MIN + b)) - -// CLIPPER logic for carry and overflow flags -#define C_ADD(a, b) ((u32)a + (u32)b < (u32)a) -#define V_ADD(a, b) (OF_ADD((s32)a, (s32)b) || UF_ADD((s32)a, (s32)b)) -#define C_SUB(a, b) ((u32)a < (u32)b) -#define V_SUB(a, b) (OF_SUB((s32)a, (s32)b) || UF_SUB((s32)a, (s32)b)) + SSW_FRD = 0x00400000, // floating registers dirty + SSW_TP = 0x00800000, // trace trap pending + SSW_ECM = 0x01000000, // enabled corrected memory error + SSW_DF = 0x02000000, // fpu disabled + SSW_M = 0x04000000, // mapped mode + SSW_KU = 0x08000000, // user protect key + SSW_UU = 0x10000000, // user data mode + SSW_K = 0x20000000, // protect key + SSW_U = 0x40000000, // user mode + SSW_P = 0x80000000, // previous mode + }; + + enum exception_vectors + { + // data memory trap group + EXCEPTION_D_CORRECTED_MEMORY_ERROR = 0x108, + EXCEPTION_D_UNCORRECTABLE_MEMORY_ERROR = 0x110, + EXCEPTION_D_ALIGNMENT_FAULT = 0x120, + EXCEPTION_D_PAGE_FAULT = 0x128, + EXCEPTION_D_READ_PROTECT_FAULT = 0x130, + EXCEPTION_D_WRITE_PROTECT_FAULT = 0x138, + + // floating-point arithmetic trap group + EXCEPTION_FLOATING_INEXACT = 0x180, + EXCEPTION_FLOATING_UNDERFLOW = 0x188, + EXCEPTION_FLOATING_DIVIDE_BY_ZERO = 0x190, + EXCEPTION_FLOATING_OVERFLOW = 0x1a0, + EXCEPTION_FLOATING_INVALID_OPERATION = 0x1c0, + + // integer arithmetic trap group + EXCEPTION_INTEGER_DIVIDE_BY_ZERO = 0x208, + + // instruction memory trap group + EXCEPTION_I_CORRECTED_MEMORY_ERROR = 0x288, + EXCEPTION_I_UNCORRECTABLE_MEMORY_ERROR = 0x290, + EXCEPTION_I_ALIGNMENT_FAULT = 0x2a0, + EXCEPTION_I_PAGE_FAULT = 0x2a8, + EXCEPTION_I_EXECUTE_PROTECT_FAULT = 0x2b0, + + // illegal operation trap group + EXCEPTION_ILLEGAL_OPERATION = 0x300, + EXCEPTION_PRIVILEGED_INSTRUCTION = 0x308, + + // diagnostic trap group + EXCEPTION_TRACE = 0x380, + + // supervisor calls (0x400-0x7f8) + EXCEPTION_SUPERVISOR_CALL_BASE = 0x400, + + // prioritized interrupts (0x800-0xff8) + EXCEPTION_INTERRUPT_BASE = 0x800, + }; + + // trap source values are shifted into the correct field in the psw + enum cpu_trap_sources + { + CTS_NO_CPU_TRAP = 0 << 24, + CTS_DIVIDE_BY_ZERO = 2 << 24, + CTS_ILLEGAL_OPERATION = 4 << 24, + CTS_PRIVILEGED_INSTRUCTION = 5 << 24, + CTS_TRACE_TRAP = 7 << 24, + }; + + enum memory_trap_sources + { + MTS_NO_MEMORY_TRAP = 0 << 28, + MTS_CORRECTED_MEMORY_ERROR = 1 << 28, + MTS_UNCORRECTABLE_MEMORY_ERROR = 2 << 28, + MTS_ALIGNMENT_FAULT = 4 << 28, + MTS_PAGE_FAULT = 5 << 28, + MTS_READ_OR_EXECUTE_PROTECT_FAULT = 6 << 28, + MTS_WRITE_PROTECT_FAULT = 7 << 28, + }; -class clipper_device : public cpu_device -{ public: - clipper_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source); - DECLARE_READ32_MEMBER(ssw) { return m_ssw; } protected: + clipper_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; // device_execute_interface overrides - virtual u32 execute_min_cycles() const override { return 1; }; - virtual u32 execute_max_cycles() const override { return 1; }; // FIXME: don't know, especially macro instructions - virtual u32 execute_input_lines() const override { return 2; }; // number of input/interrupt lines (irq/nmi) + virtual u32 execute_min_cycles() const override { return 1; } + virtual u32 execute_max_cycles() const override { return 1; } // FIXME: don't know, especially macro instructions + virtual u32 execute_input_lines() const override { return 2; } // number of input/interrupt lines (irq/nmi) 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; + virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override; // device_state_interface overrides #if 0 @@ -289,9 +261,10 @@ public: clipper_c400_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); }; -extern const device_type CLIPPER_C100; -extern const device_type CLIPPER_C300; -extern const device_type CLIPPER_C400; +DECLARE_DEVICE_TYPE(CLIPPER_C100, clipper_c100_device) +DECLARE_DEVICE_TYPE(CLIPPER_C300, clipper_c300_device) +DECLARE_DEVICE_TYPE(CLIPPER_C400, clipper_c400_device) extern CPU_DISASSEMBLE(clipper); + #endif // MAME_DEVICES_CPU_CLIPPER_H |