1 // license:BSD-3-Clause
2 // copyright-holders:Alex Pasadyn,Zsolt Vasvari
3 /***************************************************************************
4 
5     TMS34010: Portable Texas Instruments TMS34010 emulator
6 
7     Copyright Alex Pasadyn/Zsolt Vasvari
8     Parts based on code by Aaron Giles
9 
10 ***************************************************************************/
11 
12 #ifndef MAME_CPU_TMS34010_34010OPS_H
13 #define MAME_CPU_TMS34010_34010OPS_H
14 
15 #pragma once
16 
17 
18 
19 
20 /***************************************************************************
21     MEMORY I/O MACROS
22 ***************************************************************************/
23 
24 /* IO registers accessor */
25 #define IOREG(reg)                (m_IOregs[reg])
26 #define SMART_IOREG(reg)          (m_IOregs[m_is_34020 ? (int)REG020_##reg : (int)REG_##reg])
27 #define PBH()                     (IOREG(REG_CONTROL) & 0x0100)
28 #define PBV()                     (IOREG(REG_CONTROL) & 0x0200)
29 
30 
31 
32 /***************************************************************************
33     FIELD WRITE MACROS
34 ***************************************************************************/
35 
36 #define WFIELDMAC(MASK,MAX)                                                         \
37 	uint32_t shift = offset & 0x0f;                                                 \
38 	uint32_t masked_data = data & (MASK);                                           \
39 	uint32_t old;                                                                   \
40 																					\
41 	offset = offset & 0xfffffff0;                                                   \
42 																					\
43 	if (shift >= MAX)                                                               \
44 	{                                                                               \
45 		old = (uint32_t)TMS34010_RDMEM_DWORD(offset) & ~((MASK) << shift);          \
46 		TMS34010_WRMEM_DWORD(offset, (masked_data << shift) | old);                 \
47 	}                                                                               \
48 	else                                                                            \
49 	{                                                                               \
50 		old = (uint32_t)TMS34010_RDMEM_WORD(offset) & ~((MASK) << shift);           \
51 		TMS34010_WRMEM_WORD(offset, ((masked_data & (MASK)) << shift) | old);       \
52 	}
53 
54 #define WFIELDMAC_BIG(MASK,MAX)                                                     \
55 	uint32_t shift = offset & 0x0f;                                                 \
56 	uint32_t masked_data = data & (MASK);                                           \
57 	uint32_t old;                                                                   \
58 																					\
59 	offset = offset & 0xfffffff0;                                                   \
60 																					\
61 	old = (uint32_t)TMS34010_RDMEM_DWORD(offset) & ~(uint32_t)((MASK) << shift);    \
62 	TMS34010_WRMEM_DWORD(offset, (uint32_t)(masked_data << shift) | old);           \
63 	if (shift >= MAX)                                                               \
64 	{                                                                               \
65 		shift = 32 - shift;                                                         \
66 		old = (uint32_t)TMS34010_RDMEM_WORD(offset + 0x20) & ~((MASK) >> shift);    \
67 		TMS34010_WRMEM_WORD(offset, (masked_data >> shift) | old);                  \
68 	}
69 
70 #define WFIELDMAC_8()                                                               \
71 	if (true)                                                                       \
72 	{                                                                               \
73 		WFIELDMAC(0xff,9);                                                          \
74 	}
75 
76 #define RFIELDMAC_8()                                                               \
77 	if (true)                                                                       \
78 	{                                                                               \
79 		RFIELDMAC(0xff,9);                                                          \
80 	}
81 
82 #define WFIELDMAC_32()                                                              \
83 	if (offset & 0x0f)                                                              \
84 	{                                                                               \
85 		uint32_t shift = offset&0x0f;                                               \
86 		uint32_t old;                                                               \
87 		uint32_t hiword;                                                            \
88 		offset &= 0xfffffff0;                                                       \
89 		old =    ((uint32_t) TMS34010_RDMEM_DWORD (offset     )&(0xffffffff>>(0x20-shift)));   \
90 		hiword = ((uint32_t) TMS34010_RDMEM_DWORD (offset+0x20)&(0xffffffff<<shift));      \
91 		TMS34010_WRMEM_DWORD(offset     ,(data<<      shift) |old);                 \
92 		TMS34010_WRMEM_DWORD(offset+0x20,(data>>(0x20-shift))|hiword);              \
93 	}                                                                               \
94 	else                                                                            \
95 		TMS34010_WRMEM_DWORD(offset,data);
96 
97 
98 /***************************************************************************
99     FIELD READ MACROS
100 ***************************************************************************/
101 
102 #define RFIELDMAC(MASK,MAX)                                                         \
103 	uint32_t shift = offset & 0x0f;                                                 \
104 	offset = offset & 0xfffffff0;                                                   \
105 																					\
106 	if (shift >= MAX)                                                               \
107 		ret = (TMS34010_RDMEM_DWORD(offset) >> shift) & (MASK);                     \
108 	else                                                                            \
109 		ret = (TMS34010_RDMEM_WORD(offset) >> shift) & (MASK);
110 
111 #define RFIELDMAC_BIG(MASK,MAX)                                                     \
112 	uint32_t shift = offset & 0x0f;                                                 \
113 	offset = offset & 0xfffffff0;                                                   \
114 																					\
115 	ret = (uint32_t)TMS34010_RDMEM_DWORD(offset) >> shift;                          \
116 	if (shift >= MAX)                                                               \
117 		ret |= (TMS34010_RDMEM_WORD(offset + 0x20) << (32 - shift));                \
118 	ret &= MASK;
119 
120 #define RFIELDMAC_32()                                                              \
121 	if (offset&0x0f)                                                                \
122 	{                                                                               \
123 		uint32_t shift = offset&0x0f;                                               \
124 		offset &= 0xfffffff0;                                                       \
125 		return (((uint32_t)TMS34010_RDMEM_DWORD (offset     )>>      shift) |       \
126 						  (TMS34010_RDMEM_DWORD (offset+0x20)<<(0x20-shift)));      \
127 	}                                                                               \
128 	else                                                                            \
129 		return TMS34010_RDMEM_DWORD(offset);
130 
131 
132 #endif // MAME_CPU_TMS34010_34010OPS_H
133