summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/cpu/tms57002/tms57kpr.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/cpu/tms57002/tms57kpr.h')
-rw-r--r--trunk/src/emu/cpu/tms57002/tms57kpr.h171
1 files changed, 171 insertions, 0 deletions
diff --git a/trunk/src/emu/cpu/tms57002/tms57kpr.h b/trunk/src/emu/cpu/tms57002/tms57kpr.h
new file mode 100644
index 00000000000..5192974ae8c
--- /dev/null
+++ b/trunk/src/emu/cpu/tms57002/tms57kpr.h
@@ -0,0 +1,171 @@
+#ifndef TMS57KPRIVATE_H
+#define TMS57KPRIVATE_H
+
+CPU_DISASSEMBLE(tms57002);
+
+#ifdef __GNUC__
+#define noinline __attribute__((noinline))
+#else
+#define noinline /* */
+#endif
+
+enum {
+ IN_PLOAD = 0x00000001,
+ IN_CLOAD = 0x00000002,
+ SU_CVAL = 0x00000004,
+ SU_MASK = 0x00000018, SU_ST0 = 0x00, SU_ST1 = 0x08, SU_PRG = 0x10,
+ S_IDLE = 0x00000020,
+ S_READ = 0x00000040,
+ S_WRITE = 0x00000080,
+ S_BRANCH = 0x00000100,
+ S_HOST = 0x00000200
+};
+
+enum {
+ ST0_INCS = 0x000001,
+ ST0_DIRI = 0x000002,
+ ST0_FI = 0x000004,
+ ST0_SIM = 0x000008,
+ ST0_PLRI = 0x000020,
+ ST0_PBCI = 0x000040,
+ ST0_DIRO = 0x000080,
+ ST0_FO = 0x000100,
+ ST0_SOM = 0x000600,
+ ST0_PLRO = 0x000800,
+ ST0_PBCO = 0x001000,
+ ST0_CNS = 0x002000,
+ ST0_WORD = 0x004000,
+ ST0_SEL = 0x008000,
+ ST0_M = 0x030000, ST0_M_64K = 0x000000, ST0_M_256K = 0x010000, ST0_M_1M = 0x020000,
+ ST0_SRAM = 0x200000,
+
+ ST1_AOV = 0x000001,
+ ST1_SFAI = 0x000002,
+ ST1_SFAO = 0x000004,
+ ST1_MOVM = 0x000020,
+ ST1_MOV = 0x000040,
+ ST1_SFMA = 0x000180, ST1_SFMA_SHIFT = 7,
+ ST1_SFMO = 0x001800, ST1_SFMO_SHIFT = 11,
+ ST1_RND = 0x038000, ST1_RND_SHIFT = 15,
+ ST1_CRM = 0x0C0000, ST1_CRM_SHIFT = 18, ST1_CRM_32 = 0x000000, ST1_CRM_16H = 0x040000, ST1_CRM_16L = 0x080000,
+ ST1_DBP = 0x100000,
+ ST1_CAS = 0x200000,
+
+ ST1_CACHE = ST1_SFAI|ST1_SFAO|ST1_MOVM|ST1_SFMA|ST1_SFMO|ST1_RND|ST1_CRM|ST1_DBP
+};
+
+enum { BR_UB, BR_CB, BR_IDLE };
+
+enum { IBS = 8192, HBS = 4096 };
+
+typedef struct {
+ unsigned short op;
+ short next;
+ unsigned char param;
+} icd;
+
+typedef struct {
+ unsigned int st1;
+ short ipc;
+ short next;
+} hcd;
+
+typedef struct {
+ short hashbase[256];
+ hcd hashnode[HBS];
+ icd inst[IBS];
+ int hused, iused;
+} cd;
+
+typedef struct {
+ int branch;
+ short hnode;
+ short ipc;
+} cstate;
+
+typedef struct {
+ INT64 macc;
+
+ UINT32 cmem[256];
+ UINT32 dmem0[256];
+ UINT32 dmem1[32];
+
+ UINT32 si[4], so[4];
+
+ UINT32 st0, st1, sti;
+ UINT32 aacc, xoa, xba, xwr, xrd, creg;
+
+ UINT8 pc, ca, id, ba0, ba1, rptc, rptc_next, sa;
+
+ UINT32 xm_adr;
+
+ UINT8 host[4], hidx, allow_update;
+
+ cd cache;
+
+ address_space *program, *data;
+ int icount;
+ int unsupported_inst_warning;
+} tms57002_t;
+
+void tms57002_decode_cat1(tms57002_t *s, UINT32 opcode, unsigned short *op, cstate *cs);
+void tms57002_decode_cat2_pre(tms57002_t *s, UINT32 opcode, unsigned short *op, cstate *cs);
+void tms57002_decode_cat3(tms57002_t *s, UINT32 opcode, unsigned short *op, cstate *cs);
+void tms57002_decode_cat2_post(tms57002_t *s, UINT32 opcode, unsigned short *op, cstate *cs);
+
+INLINE int xmode(UINT32 opcode, char type)
+{
+ if(((opcode & 0x400) && (type == 'c')) || (!(opcode & 0x400) && (type == 'd'))) {
+ if(opcode & 0x100)
+ return 0;
+ else if(opcode & 0x80)
+ return 2;
+ else
+ return 1;
+ } else if(opcode & 0x200)
+ return 2;
+
+ return 1;
+}
+
+INLINE int sfao(UINT32 st1)
+{
+ return st1 & ST1_SFAO ? 1 : 0;
+}
+
+INLINE int dbp(UINT32 st1)
+{
+ return st1 & ST1_DBP ? 1 : 0;
+}
+
+INLINE int crm(UINT32 st1)
+{
+ return (st1 & ST1_CRM) >> ST1_CRM_SHIFT;
+}
+
+INLINE int sfai(UINT32 st1)
+{
+ return st1 & ST1_SFAI ? 1 : 0;
+}
+
+INLINE int sfmo(UINT32 st1)
+{
+ return (st1 & ST1_SFMO) >> ST1_SFMO_SHIFT;
+}
+
+INLINE int rnd(UINT32 st1)
+{
+ return (st1 & ST1_RND) >> ST1_RND_SHIFT;
+}
+
+INLINE int movm(UINT32 st1)
+{
+ return st1 & ST1_MOVM ? 1 : 0;
+}
+
+INLINE int sfma(UINT32 st1)
+{
+ return (st1 & ST1_SFMA) >> ST1_SFMA_SHIFT;
+}
+
+#endif