trunk/src/emu/cpu/tms32051/32051ops.c
r26840 | r26841 | |
1 | 1 | // stack is LIFO and is 8 levels deep, there is no stackpointer on the real chip |
2 | | INLINE void PUSH_STACK(tms32051_state *cpustate, UINT16 pc) |
| 2 | void tms32051_device::PUSH_STACK(UINT16 pc) |
3 | 3 | { |
4 | | cpustate->pcstack_ptr = (cpustate->pcstack_ptr - 1) & 7; |
5 | | cpustate->pcstack[cpustate->pcstack_ptr] = pc; |
| 4 | m_pcstack_ptr = (m_pcstack_ptr - 1) & 7; |
| 5 | m_pcstack[m_pcstack_ptr] = pc; |
6 | 6 | } |
7 | 7 | |
8 | | INLINE UINT16 POP_STACK(tms32051_state *cpustate) |
| 8 | UINT16 tms32051_device::POP_STACK() |
9 | 9 | { |
10 | | UINT16 pc = cpustate->pcstack[cpustate->pcstack_ptr]; |
11 | | cpustate->pcstack_ptr = (cpustate->pcstack_ptr + 1) & 7; |
12 | | cpustate->pcstack[(cpustate->pcstack_ptr + 7) & 7] = cpustate->pcstack[(cpustate->pcstack_ptr + 6) & 7]; |
| 10 | UINT16 pc = m_pcstack[m_pcstack_ptr]; |
| 11 | m_pcstack_ptr = (m_pcstack_ptr + 1) & 7; |
| 12 | m_pcstack[(m_pcstack_ptr + 7) & 7] = m_pcstack[(m_pcstack_ptr + 6) & 7]; |
13 | 13 | return pc; |
14 | 14 | } |
15 | 15 | |
16 | | INLINE INT32 SUB(tms32051_state *cpustate, UINT32 a, UINT32 b) |
| 16 | INT32 tms32051_device::SUB(UINT32 a, UINT32 b) |
17 | 17 | { |
18 | 18 | UINT32 res = a - b; |
19 | 19 | |
20 | 20 | // C is cleared if borrow was generated |
21 | | cpustate->st1.c = (b > a) ? 0 : 1; |
| 21 | m_st1.c = (b > a) ? 0 : 1; |
22 | 22 | |
23 | 23 | // check overflow |
24 | 24 | if ((a ^ b) & (a ^ res) & 0x80000000) |
25 | 25 | { |
26 | | if (cpustate->st0.ovm) // overflow saturation mode |
| 26 | if (m_st0.ovm) // overflow saturation mode |
27 | 27 | { |
28 | 28 | res = ((INT32)(res) < 0) ? 0x7fffffff : 0x80000000; |
29 | 29 | } |
30 | 30 | |
31 | 31 | // set OV, this is a sticky flag |
32 | | cpustate->st0.ov = 1; |
| 32 | m_st0.ov = 1; |
33 | 33 | } |
34 | 34 | |
35 | 35 | return (INT32)(res); |
36 | 36 | } |
37 | 37 | |
38 | | INLINE INT32 ADD(tms32051_state *cpustate, UINT32 a, UINT32 b) |
| 38 | INT32 tms32051_device::ADD(UINT32 a, UINT32 b) |
39 | 39 | { |
40 | 40 | UINT32 res = a + b; |
41 | 41 | |
42 | 42 | // C is set if carry was generated |
43 | | cpustate->st1.c = (a > res) ? 1 : 0; |
| 43 | m_st1.c = (a > res) ? 1 : 0; |
44 | 44 | |
45 | 45 | // check overflow |
46 | 46 | if ((a ^ res) & (b ^ res) & 0x80000000) |
47 | 47 | { |
48 | | if (cpustate->st0.ovm) // overflow saturation mode |
| 48 | if (m_st0.ovm) // overflow saturation mode |
49 | 49 | { |
50 | 50 | res = ((INT32)(res) < 0) ? 0x7fffffff : 0x80000000; |
51 | 51 | } |
52 | 52 | |
53 | 53 | // set OV, this is a sticky flag |
54 | | cpustate->st0.ov = 1; |
| 54 | m_st0.ov = 1; |
55 | 55 | } |
56 | 56 | |
57 | 57 | return (INT32)(res); |
58 | 58 | } |
59 | 59 | |
60 | 60 | |
61 | | INLINE void UPDATE_AR(tms32051_state *cpustate, int ar, int step) |
| 61 | void tms32051_device::UPDATE_AR(int ar, int step) |
62 | 62 | { |
63 | | int cenb1 = (cpustate->cbcr >> 3) & 0x1; |
64 | | int car1 = cpustate->cbcr & 0x7; |
65 | | int cenb2 = (cpustate->cbcr >> 7) & 0x1; |
66 | | int car2 = (cpustate->cbcr >> 4) & 0x7; |
| 63 | int cenb1 = (m_cbcr >> 3) & 0x1; |
| 64 | int car1 = m_cbcr & 0x7; |
| 65 | int cenb2 = (m_cbcr >> 7) & 0x1; |
| 66 | int car2 = (m_cbcr >> 4) & 0x7; |
67 | 67 | |
68 | 68 | if (cenb1 && ar == car1) |
69 | 69 | { |
70 | 70 | // update circular buffer 1, note that it only checks == |
71 | | if (cpustate->ar[ar] == cpustate->cber1) |
| 71 | if (m_ar[ar] == m_cber1) |
72 | 72 | { |
73 | | cpustate->ar[ar] = cpustate->cbsr1; |
| 73 | m_ar[ar] = m_cbsr1; |
74 | 74 | } |
75 | 75 | else |
76 | 76 | { |
77 | | cpustate->ar[ar] += step; |
| 77 | m_ar[ar] += step; |
78 | 78 | } |
79 | 79 | } |
80 | 80 | else if (cenb2 && ar == car2) |
81 | 81 | { |
82 | 82 | // update circular buffer 2, note that it only checks == |
83 | | if (cpustate->ar[ar] == cpustate->cber2) |
| 83 | if (m_ar[ar] == m_cber2) |
84 | 84 | { |
85 | | cpustate->ar[ar] = cpustate->cbsr2; |
| 85 | m_ar[ar] = m_cbsr2; |
86 | 86 | } |
87 | 87 | else |
88 | 88 | { |
89 | | cpustate->ar[ar] += step; |
| 89 | m_ar[ar] += step; |
90 | 90 | } |
91 | 91 | } |
92 | 92 | else |
93 | 93 | { |
94 | | cpustate->ar[ar] += step; |
| 94 | m_ar[ar] += step; |
95 | 95 | } |
96 | 96 | } |
97 | 97 | |
98 | | INLINE void UPDATE_ARP(tms32051_state *cpustate, int nar) |
| 98 | void tms32051_device::UPDATE_ARP(int nar) |
99 | 99 | { |
100 | | cpustate->st1.arb = cpustate->st0.arp; |
101 | | cpustate->st0.arp = nar; |
| 100 | m_st1.arb = m_st0.arp; |
| 101 | m_st0.arp = nar; |
102 | 102 | } |
103 | 103 | |
104 | | static UINT16 GET_ADDRESS(tms32051_state *cpustate) |
| 104 | UINT16 tms32051_device::GET_ADDRESS() |
105 | 105 | { |
106 | | if (cpustate->op & 0x80) // Indirect Addressing |
| 106 | if (m_op & 0x80) // Indirect Addressing |
107 | 107 | { |
108 | 108 | UINT16 ea; |
109 | | int arp = cpustate->st0.arp; |
110 | | int nar = cpustate->op & 0x7; |
| 109 | int arp = m_st0.arp; |
| 110 | int nar = m_op & 0x7; |
111 | 111 | |
112 | | ea = cpustate->ar[arp]; |
| 112 | ea = m_ar[arp]; |
113 | 113 | |
114 | | switch ((cpustate->op >> 3) & 0xf) |
| 114 | switch ((m_op >> 3) & 0xf) |
115 | 115 | { |
116 | 116 | case 0x0: // * (no operation) |
117 | 117 | { |
r26840 | r26841 | |
119 | 119 | } |
120 | 120 | case 0x1: // *, ARn (NAR -> ARP) |
121 | 121 | { |
122 | | UPDATE_ARP(cpustate, nar); |
| 122 | UPDATE_ARP(nar); |
123 | 123 | break; |
124 | 124 | } |
125 | 125 | case 0x2: // *- ((CurrentAR)-1 -> CurrentAR) |
126 | 126 | { |
127 | | UPDATE_AR(cpustate, arp, -1); |
| 127 | UPDATE_AR(arp, -1); |
128 | 128 | break; |
129 | 129 | } |
130 | 130 | case 0x3: // *-, ARn ((CurrentAR)-1 -> CurrentAR, NAR -> ARP) |
131 | 131 | { |
132 | | UPDATE_AR(cpustate, arp, -1); |
133 | | UPDATE_ARP(cpustate, nar); |
| 132 | UPDATE_AR(arp, -1); |
| 133 | UPDATE_ARP(nar); |
134 | 134 | break; |
135 | 135 | } |
136 | 136 | case 0x4: // *+ ((CurrentAR)+1 -> CurrentAR) |
137 | 137 | { |
138 | | UPDATE_AR(cpustate, arp, 1); |
| 138 | UPDATE_AR(arp, 1); |
139 | 139 | break; |
140 | 140 | } |
141 | 141 | case 0x5: // *+, ARn ((CurrentAR)+1 -> CurrentAR, NAR -> ARP) |
142 | 142 | { |
143 | | UPDATE_AR(cpustate, arp, 1); |
144 | | UPDATE_ARP(cpustate, nar); |
| 143 | UPDATE_AR(arp, 1); |
| 144 | UPDATE_ARP(nar); |
145 | 145 | break; |
146 | 146 | } |
147 | 147 | case 0xa: // *0- ((CurrentAR) - INDX) |
148 | 148 | { |
149 | | UPDATE_AR(cpustate, arp, -cpustate->indx); |
| 149 | UPDATE_AR(arp, -m_indx); |
150 | 150 | break; |
151 | 151 | } |
152 | 152 | case 0xb: // *0-, ARn ((CurrentAR) - INDX -> CurrentAR, NAR -> ARP) |
153 | 153 | { |
154 | | UPDATE_AR(cpustate, arp, -cpustate->indx); |
155 | | UPDATE_ARP(cpustate, nar); |
| 154 | UPDATE_AR(arp, -m_indx); |
| 155 | UPDATE_ARP(nar); |
156 | 156 | break; |
157 | 157 | } |
158 | 158 | case 0xc: // *0+ ((CurrentAR) + INDX -> CurrentAR) |
159 | 159 | { |
160 | | UPDATE_AR(cpustate, arp, cpustate->indx); |
| 160 | UPDATE_AR(arp, m_indx); |
161 | 161 | break; |
162 | 162 | } |
163 | 163 | case 0xd: // *0+, ARn ((CurrentAR) + INDX -> CurrentAR, NAR -> ARP) |
164 | 164 | { |
165 | | UPDATE_AR(cpustate, arp, cpustate->indx); |
166 | | UPDATE_ARP(cpustate, nar); |
| 165 | UPDATE_AR(arp, m_indx); |
| 166 | UPDATE_ARP(nar); |
167 | 167 | break; |
168 | 168 | } |
169 | 169 | |
170 | | default: fatalerror("32051: GET_ADDRESS: unimplemented indirect addressing mode %d at %04X (%04X)\n", (cpustate->op >> 3) & 0xf, cpustate->pc, cpustate->op); |
| 170 | default: fatalerror("32051: GET_ADDRESS: unimplemented indirect addressing mode %d at %04X (%04X)\n", (m_op >> 3) & 0xf, m_pc, m_op); |
171 | 171 | } |
172 | 172 | |
173 | 173 | return ea; |
174 | 174 | } |
175 | 175 | else // Direct Addressing |
176 | 176 | { |
177 | | return cpustate->st0.dp | (cpustate->op & 0x7f); |
| 177 | return m_st0.dp | (m_op & 0x7f); |
178 | 178 | } |
179 | 179 | } |
180 | 180 | |
181 | | INLINE int GET_ZLVC_CONDITION(tms32051_state *cpustate, int zlvc, int zlvc_mask) |
| 181 | int tms32051_device::GET_ZLVC_CONDITION(int zlvc, int zlvc_mask) |
182 | 182 | { |
183 | 183 | if (zlvc_mask & 0x2) // OV-bit |
184 | 184 | { |
185 | | if ((zlvc & 0x2) && cpustate->st0.ov) // OV |
| 185 | if ((zlvc & 0x2) && m_st0.ov) // OV |
186 | 186 | { |
187 | 187 | // clear OV |
188 | | cpustate->st0.ov = 0; |
| 188 | m_st0.ov = 0; |
189 | 189 | |
190 | 190 | return 1; |
191 | 191 | } |
192 | | else if ((zlvc & 0x2) == 0 && cpustate->st0.ov == 0) // NOV |
| 192 | else if ((zlvc & 0x2) == 0 && m_st0.ov == 0) // NOV |
193 | 193 | return 1; |
194 | 194 | } |
195 | 195 | if (zlvc_mask & 0x1) // C-bit |
196 | 196 | { |
197 | | if ((zlvc & 0x1) && cpustate->st1.c) // C |
| 197 | if ((zlvc & 0x1) && m_st1.c) // C |
198 | 198 | return 1; |
199 | | else if ((zlvc & 0x1) == 0 && cpustate->st1.c == 0) // NC |
| 199 | else if ((zlvc & 0x1) == 0 && m_st1.c == 0) // NC |
200 | 200 | return 1; |
201 | 201 | } |
202 | 202 | if (zlvc_mask & 0x8) // Z-bit |
203 | 203 | { |
204 | | if ((zlvc & 0x8) && (INT32)(cpustate->acc) == 0) // EQ |
| 204 | if ((zlvc & 0x8) && (INT32)(m_acc) == 0) // EQ |
205 | 205 | return 1; |
206 | | else if ((zlvc & 0x8) == 0 && (INT32)(cpustate->acc) != 0) // NEQ |
| 206 | else if ((zlvc & 0x8) == 0 && (INT32)(m_acc) != 0) // NEQ |
207 | 207 | return 1; |
208 | 208 | } |
209 | 209 | if (zlvc_mask & 0x4) // L-bit |
210 | 210 | { |
211 | | if ((zlvc & 0x4) && (INT32)(cpustate->acc) < 0) // LT |
| 211 | if ((zlvc & 0x4) && (INT32)(m_acc) < 0) // LT |
212 | 212 | return 1; |
213 | | else if ((zlvc & 0x4) == 0 && (INT32)(cpustate->acc) > 0) // GT |
| 213 | else if ((zlvc & 0x4) == 0 && (INT32)(m_acc) > 0) // GT |
214 | 214 | return 1; |
215 | 215 | } |
216 | 216 | return 0; |
217 | 217 | } |
218 | 218 | |
219 | | INLINE int GET_TP_CONDITION(tms32051_state *cpustate, int tp) |
| 219 | int tms32051_device::GET_TP_CONDITION(int tp) |
220 | 220 | { |
221 | 221 | switch (tp) |
222 | 222 | { |
r26840 | r26841 | |
227 | 227 | } |
228 | 228 | case 1: // TC = 1 |
229 | 229 | { |
230 | | return cpustate->st1.tc; |
| 230 | return m_st1.tc; |
231 | 231 | } |
232 | 232 | case 2: // TC = 0 |
233 | 233 | { |
234 | | return cpustate->st1.tc ^ 1; |
| 234 | return m_st1.tc ^ 1; |
235 | 235 | } |
236 | 236 | case 3: // always false |
237 | 237 | { |
r26840 | r26841 | |
241 | 241 | return 0; |
242 | 242 | } |
243 | 243 | |
244 | | INLINE INT32 PREG_PSCALER(tms32051_state *cpustate, INT32 preg) |
| 244 | INT32 tms32051_device::PREG_PSCALER(INT32 preg) |
245 | 245 | { |
246 | | switch (cpustate->st1.pm & 3) |
| 246 | switch (m_st1.pm & 3) |
247 | 247 | { |
248 | 248 | case 0: // No shift |
249 | 249 | { |
r26840 | r26841 | |
267 | 267 | |
268 | 268 | |
269 | 269 | |
270 | | static void op_invalid(tms32051_state *cpustate) |
| 270 | void tms32051_device::op_invalid() |
271 | 271 | { |
272 | | fatalerror("32051: invalid op at %08X\n", cpustate->pc-1); |
| 272 | fatalerror("32051: invalid op at %08X\n", m_pc-1); |
273 | 273 | } |
274 | 274 | |
275 | | static void op_group_be(tms32051_state *cpustate); |
276 | | static void op_group_bf(tms32051_state *cpustate); |
277 | | |
278 | 275 | /*****************************************************************************/ |
279 | 276 | |
280 | | static void op_abs(tms32051_state *cpustate) |
| 277 | void tms32051_device::op_abs() |
281 | 278 | { |
282 | | fatalerror("32051: unimplemented op abs at %08X\n", cpustate->pc-1); |
| 279 | fatalerror("32051: unimplemented op abs at %08X\n", m_pc-1); |
283 | 280 | } |
284 | 281 | |
285 | | static void op_adcb(tms32051_state *cpustate) |
| 282 | void tms32051_device::op_adcb() |
286 | 283 | { |
287 | | fatalerror("32051: unimplemented op adcb at %08X\n", cpustate->pc-1); |
| 284 | fatalerror("32051: unimplemented op adcb at %08X\n", m_pc-1); |
288 | 285 | } |
289 | 286 | |
290 | | static void op_add_mem(tms32051_state *cpustate) |
| 287 | void tms32051_device::op_add_mem() |
291 | 288 | { |
292 | 289 | INT32 d; |
293 | | UINT16 ea = GET_ADDRESS(cpustate); |
294 | | UINT16 data = DM_READ16(cpustate, ea); |
295 | | int shift = (cpustate->op >> 8) & 0xf; |
| 290 | UINT16 ea = GET_ADDRESS(); |
| 291 | UINT16 data = DM_READ16(ea); |
| 292 | int shift = (m_op >> 8) & 0xf; |
296 | 293 | |
297 | | if (cpustate->st1.sxm) |
| 294 | if (m_st1.sxm) |
298 | 295 | { |
299 | 296 | d = (INT32)(INT16)(data) << shift; |
300 | 297 | } |
r26840 | r26841 | |
303 | 300 | d = (UINT32)(UINT16)(data) << shift; |
304 | 301 | } |
305 | 302 | |
306 | | cpustate->acc = ADD(cpustate, cpustate->acc, d); |
| 303 | m_acc = ADD(m_acc, d); |
307 | 304 | |
308 | 305 | CYCLES(1); |
309 | 306 | } |
310 | 307 | |
311 | | static void op_add_simm(tms32051_state *cpustate) |
| 308 | void tms32051_device::op_add_simm() |
312 | 309 | { |
313 | | UINT16 imm = cpustate->op & 0xff; |
| 310 | UINT16 imm = m_op & 0xff; |
314 | 311 | |
315 | | cpustate->acc = ADD(cpustate, cpustate->acc, imm); |
| 312 | m_acc = ADD(m_acc, imm); |
316 | 313 | |
317 | 314 | CYCLES(1); |
318 | 315 | } |
319 | 316 | |
320 | | static void op_add_limm(tms32051_state *cpustate) |
| 317 | void tms32051_device::op_add_limm() |
321 | 318 | { |
322 | 319 | INT32 d; |
323 | | UINT16 imm = ROPCODE(cpustate); |
324 | | int shift = cpustate->op & 0xf; |
| 320 | UINT16 imm = ROPCODE(); |
| 321 | int shift = m_op & 0xf; |
325 | 322 | |
326 | | if (cpustate->st1.sxm) |
| 323 | if (m_st1.sxm) |
327 | 324 | { |
328 | 325 | d = (INT32)(INT16)(imm) << shift; |
329 | 326 | } |
r26840 | r26841 | |
332 | 329 | d = (UINT32)(UINT16)(imm) << shift; |
333 | 330 | } |
334 | 331 | |
335 | | cpustate->acc = ADD(cpustate, cpustate->acc, d); |
| 332 | m_acc = ADD(m_acc, d); |
336 | 333 | |
337 | 334 | CYCLES(2); |
338 | 335 | } |
339 | 336 | |
340 | | static void op_add_s16_mem(tms32051_state *cpustate) |
| 337 | void tms32051_device::op_add_s16_mem() |
341 | 338 | { |
342 | | fatalerror("32051: unimplemented op add s16 mem at %08X\n", cpustate->pc-1); |
| 339 | fatalerror("32051: unimplemented op add s16 mem at %08X\n", m_pc-1); |
343 | 340 | } |
344 | 341 | |
345 | | static void op_addb(tms32051_state *cpustate) |
| 342 | void tms32051_device::op_addb() |
346 | 343 | { |
347 | | cpustate->acc = ADD(cpustate, cpustate->acc, cpustate->accb); |
| 344 | m_acc = ADD(m_acc, m_accb); |
348 | 345 | |
349 | 346 | CYCLES(1); |
350 | 347 | } |
351 | 348 | |
352 | | static void op_addc(tms32051_state *cpustate) |
| 349 | void tms32051_device::op_addc() |
353 | 350 | { |
354 | | fatalerror("32051: unimplemented op addc at %08X\n", cpustate->pc-1); |
| 351 | fatalerror("32051: unimplemented op addc at %08X\n", m_pc-1); |
355 | 352 | } |
356 | 353 | |
357 | | static void op_adds(tms32051_state *cpustate) |
| 354 | void tms32051_device::op_adds() |
358 | 355 | { |
359 | | fatalerror("32051: unimplemented op adds at %08X\n", cpustate->pc-1); |
| 356 | fatalerror("32051: unimplemented op adds at %08X\n", m_pc-1); |
360 | 357 | } |
361 | 358 | |
362 | | static void op_addt(tms32051_state *cpustate) |
| 359 | void tms32051_device::op_addt() |
363 | 360 | { |
364 | | fatalerror("32051: unimplemented op addt at %08X\n", cpustate->pc-1); |
| 361 | fatalerror("32051: unimplemented op addt at %08X\n", m_pc-1); |
365 | 362 | } |
366 | 363 | |
367 | | static void op_and_mem(tms32051_state *cpustate) |
| 364 | void tms32051_device::op_and_mem() |
368 | 365 | { |
369 | | fatalerror("32051: unimplemented op and mem at %08X\n", cpustate->pc-1); |
| 366 | fatalerror("32051: unimplemented op and mem at %08X\n", m_pc-1); |
370 | 367 | } |
371 | 368 | |
372 | | static void op_and_limm(tms32051_state *cpustate) |
| 369 | void tms32051_device::op_and_limm() |
373 | 370 | { |
374 | | UINT32 imm = ROPCODE(cpustate); |
375 | | int shift = cpustate->op & 0xf; |
| 371 | UINT32 imm = ROPCODE(); |
| 372 | int shift = m_op & 0xf; |
376 | 373 | |
377 | | cpustate->acc &= imm << shift; |
| 374 | m_acc &= imm << shift; |
378 | 375 | |
379 | 376 | CYCLES(2); |
380 | 377 | } |
381 | 378 | |
382 | | static void op_and_s16_limm(tms32051_state *cpustate) |
| 379 | void tms32051_device::op_and_s16_limm() |
383 | 380 | { |
384 | | fatalerror("32051: unimplemented op and s16 limm at %08X\n", cpustate->pc-1); |
| 381 | fatalerror("32051: unimplemented op and s16 limm at %08X\n", m_pc-1); |
385 | 382 | } |
386 | 383 | |
387 | | static void op_andb(tms32051_state *cpustate) |
| 384 | void tms32051_device::op_andb() |
388 | 385 | { |
389 | | fatalerror("32051: unimplemented op andb at %08X\n", cpustate->pc-1); |
| 386 | fatalerror("32051: unimplemented op andb at %08X\n", m_pc-1); |
390 | 387 | } |
391 | 388 | |
392 | | static void op_bsar(tms32051_state *cpustate) |
| 389 | void tms32051_device::op_bsar() |
393 | 390 | { |
394 | | int shift = (cpustate->op & 0xf) + 1; |
| 391 | int shift = (m_op & 0xf) + 1; |
395 | 392 | |
396 | | if (cpustate->st1.sxm) |
| 393 | if (m_st1.sxm) |
397 | 394 | { |
398 | | cpustate->acc = (INT32)(cpustate->acc) >> shift; |
| 395 | m_acc = (INT32)(m_acc) >> shift; |
399 | 396 | } |
400 | 397 | else |
401 | 398 | { |
402 | | cpustate->acc = (UINT32)(cpustate->acc) >> shift; |
| 399 | m_acc = (UINT32)(m_acc) >> shift; |
403 | 400 | } |
404 | 401 | |
405 | 402 | CYCLES(1); |
406 | 403 | } |
407 | 404 | |
408 | | static void op_cmpl(tms32051_state *cpustate) |
| 405 | void tms32051_device::op_cmpl() |
409 | 406 | { |
410 | | cpustate->acc = ~(UINT32)(cpustate->acc); |
| 407 | m_acc = ~(UINT32)(m_acc); |
411 | 408 | |
412 | 409 | CYCLES(1); |
413 | 410 | } |
414 | 411 | |
415 | | static void op_crgt(tms32051_state *cpustate) |
| 412 | void tms32051_device::op_crgt() |
416 | 413 | { |
417 | | if (cpustate->acc >= cpustate->accb) |
| 414 | if (m_acc >= m_accb) |
418 | 415 | { |
419 | | cpustate->accb = cpustate->acc; |
420 | | cpustate->st1.c = 1; |
| 416 | m_accb = m_acc; |
| 417 | m_st1.c = 1; |
421 | 418 | } |
422 | 419 | else |
423 | 420 | { |
424 | | cpustate->acc = cpustate->accb; |
425 | | cpustate->st1.c = 0; |
| 421 | m_acc = m_accb; |
| 422 | m_st1.c = 0; |
426 | 423 | } |
427 | 424 | |
428 | 425 | CYCLES(1); |
429 | 426 | } |
430 | 427 | |
431 | | static void op_crlt(tms32051_state *cpustate) |
| 428 | void tms32051_device::op_crlt() |
432 | 429 | { |
433 | | if (cpustate->acc >= cpustate->accb) |
| 430 | if (m_acc >= m_accb) |
434 | 431 | { |
435 | | cpustate->acc = cpustate->accb; |
436 | | cpustate->st1.c = 0; |
| 432 | m_acc = m_accb; |
| 433 | m_st1.c = 0; |
437 | 434 | } |
438 | 435 | else |
439 | 436 | { |
440 | | cpustate->accb = cpustate->acc; |
441 | | cpustate->st1.c = 1; |
| 437 | m_accb = m_acc; |
| 438 | m_st1.c = 1; |
442 | 439 | } |
443 | 440 | |
444 | 441 | CYCLES(1); |
445 | 442 | } |
446 | 443 | |
447 | | static void op_exar(tms32051_state *cpustate) |
| 444 | void tms32051_device::op_exar() |
448 | 445 | { |
449 | | INT32 tmp = cpustate->acc; |
450 | | cpustate->acc = cpustate->accb; |
451 | | cpustate->accb = tmp; |
| 446 | INT32 tmp = m_acc; |
| 447 | m_acc = m_accb; |
| 448 | m_accb = tmp; |
452 | 449 | |
453 | 450 | CYCLES(1); |
454 | 451 | } |
455 | 452 | |
456 | | static void op_lacb(tms32051_state *cpustate) |
| 453 | void tms32051_device::op_lacb() |
457 | 454 | { |
458 | | cpustate->acc = cpustate->accb; |
| 455 | m_acc = m_accb; |
459 | 456 | |
460 | 457 | CYCLES(1); |
461 | 458 | } |
462 | 459 | |
463 | | static void op_lacc_mem(tms32051_state *cpustate) |
| 460 | void tms32051_device::op_lacc_mem() |
464 | 461 | { |
465 | | int shift = (cpustate->op >> 8) & 0xf; |
466 | | UINT16 ea = GET_ADDRESS(cpustate); |
467 | | UINT16 data = DM_READ16(cpustate, ea); |
| 462 | int shift = (m_op >> 8) & 0xf; |
| 463 | UINT16 ea = GET_ADDRESS(); |
| 464 | UINT16 data = DM_READ16(ea); |
468 | 465 | |
469 | | if (cpustate->st1.sxm) |
| 466 | if (m_st1.sxm) |
470 | 467 | { |
471 | | cpustate->acc = (INT32)(INT16)(data) << shift; |
| 468 | m_acc = (INT32)(INT16)(data) << shift; |
472 | 469 | } |
473 | 470 | else |
474 | 471 | { |
475 | | cpustate->acc = (UINT32)(UINT16)(data) << shift; |
| 472 | m_acc = (UINT32)(UINT16)(data) << shift; |
476 | 473 | } |
477 | 474 | |
478 | 475 | CYCLES(1); |
479 | 476 | } |
480 | 477 | |
481 | | static void op_lacc_limm(tms32051_state *cpustate) |
| 478 | void tms32051_device::op_lacc_limm() |
482 | 479 | { |
483 | | UINT16 imm = ROPCODE(cpustate); |
484 | | int shift = cpustate->op & 0xf; |
| 480 | UINT16 imm = ROPCODE(); |
| 481 | int shift = m_op & 0xf; |
485 | 482 | |
486 | | if (cpustate->st1.sxm) |
| 483 | if (m_st1.sxm) |
487 | 484 | { |
488 | | cpustate->acc = (INT32)(INT16)(imm) << shift; |
| 485 | m_acc = (INT32)(INT16)(imm) << shift; |
489 | 486 | } |
490 | 487 | else |
491 | 488 | { |
492 | | cpustate->acc = (UINT32)(UINT16)(imm) << shift; |
| 489 | m_acc = (UINT32)(UINT16)(imm) << shift; |
493 | 490 | } |
494 | 491 | |
495 | 492 | CYCLES(1); |
496 | 493 | } |
497 | 494 | |
498 | | static void op_lacc_s16_mem(tms32051_state *cpustate) |
| 495 | void tms32051_device::op_lacc_s16_mem() |
499 | 496 | { |
500 | | UINT16 ea = GET_ADDRESS(cpustate); |
501 | | cpustate->acc = DM_READ16(cpustate, ea) << 16; |
| 497 | UINT16 ea = GET_ADDRESS(); |
| 498 | m_acc = DM_READ16(ea) << 16; |
502 | 499 | |
503 | 500 | CYCLES(1); |
504 | 501 | } |
505 | 502 | |
506 | | static void op_lacl_simm(tms32051_state *cpustate) |
| 503 | void tms32051_device::op_lacl_simm() |
507 | 504 | { |
508 | | cpustate->acc = cpustate->op & 0xff; |
| 505 | m_acc = m_op & 0xff; |
509 | 506 | |
510 | 507 | CYCLES(1); |
511 | 508 | } |
512 | 509 | |
513 | | static void op_lacl_mem(tms32051_state *cpustate) |
| 510 | void tms32051_device::op_lacl_mem() |
514 | 511 | { |
515 | | UINT16 ea = GET_ADDRESS(cpustate); |
516 | | cpustate->acc = DM_READ16(cpustate, ea) & 0xffff; |
| 512 | UINT16 ea = GET_ADDRESS(); |
| 513 | m_acc = DM_READ16(ea) & 0xffff; |
517 | 514 | |
518 | 515 | CYCLES(1); |
519 | 516 | } |
520 | 517 | |
521 | | static void op_lact(tms32051_state *cpustate) |
| 518 | void tms32051_device::op_lact() |
522 | 519 | { |
523 | | fatalerror("32051: unimplemented op lact at %08X\n", cpustate->pc-1); |
| 520 | fatalerror("32051: unimplemented op lact at %08X\n", m_pc-1); |
524 | 521 | } |
525 | 522 | |
526 | | static void op_lamm(tms32051_state *cpustate) |
| 523 | void tms32051_device::op_lamm() |
527 | 524 | { |
528 | | UINT16 ea = GET_ADDRESS(cpustate) & 0x7f; |
529 | | cpustate->acc = DM_READ16(cpustate, ea) & 0xffff; |
| 525 | UINT16 ea = GET_ADDRESS() & 0x7f; |
| 526 | m_acc = DM_READ16(ea) & 0xffff; |
530 | 527 | |
531 | 528 | CYCLES(1); |
532 | 529 | } |
533 | 530 | |
534 | | static void op_neg(tms32051_state *cpustate) |
| 531 | void tms32051_device::op_neg() |
535 | 532 | { |
536 | | if ((UINT32)(cpustate->acc) == 0x80000000) |
| 533 | if ((UINT32)(m_acc) == 0x80000000) |
537 | 534 | { |
538 | | cpustate->st0.ov = 1; |
539 | | cpustate->st1.c = 0; |
540 | | cpustate->acc = (cpustate->st0.ovm) ? 0x7fffffff : 0x80000000; |
| 535 | m_st0.ov = 1; |
| 536 | m_st1.c = 0; |
| 537 | m_acc = (m_st0.ovm) ? 0x7fffffff : 0x80000000; |
541 | 538 | } |
542 | 539 | else |
543 | 540 | { |
544 | | cpustate->acc = 0 - (UINT32)(cpustate->acc); |
545 | | cpustate->st1.c = (cpustate->acc == 0) ? 1 : 0; |
| 541 | m_acc = 0 - (UINT32)(m_acc); |
| 542 | m_st1.c = (m_acc == 0) ? 1 : 0; |
546 | 543 | } |
547 | 544 | |
548 | 545 | CYCLES(1); |
549 | 546 | } |
550 | 547 | |
551 | | static void op_norm(tms32051_state *cpustate) |
| 548 | void tms32051_device::op_norm() |
552 | 549 | { |
553 | | fatalerror("32051: unimplemented op norm at %08X\n", cpustate->pc-1); |
| 550 | fatalerror("32051: unimplemented op norm at %08X\n", m_pc-1); |
554 | 551 | } |
555 | 552 | |
556 | | static void op_or_mem(tms32051_state *cpustate) |
| 553 | void tms32051_device::op_or_mem() |
557 | 554 | { |
558 | | UINT16 ea = GET_ADDRESS(cpustate); |
559 | | UINT16 data = DM_READ16(cpustate, ea); |
| 555 | UINT16 ea = GET_ADDRESS(); |
| 556 | UINT16 data = DM_READ16(ea); |
560 | 557 | |
561 | | cpustate->acc |= (UINT32)(data); |
| 558 | m_acc |= (UINT32)(data); |
562 | 559 | |
563 | 560 | CYCLES(1); |
564 | 561 | } |
565 | 562 | |
566 | | static void op_or_limm(tms32051_state *cpustate) |
| 563 | void tms32051_device::op_or_limm() |
567 | 564 | { |
568 | | UINT32 imm = ROPCODE(cpustate); |
569 | | int shift = cpustate->op & 0xf; |
| 565 | UINT32 imm = ROPCODE(); |
| 566 | int shift = m_op & 0xf; |
570 | 567 | |
571 | | cpustate->acc |= imm << shift; |
| 568 | m_acc |= imm << shift; |
572 | 569 | |
573 | 570 | CYCLES(1); |
574 | 571 | } |
575 | 572 | |
576 | | static void op_or_s16_limm(tms32051_state *cpustate) |
| 573 | void tms32051_device::op_or_s16_limm() |
577 | 574 | { |
578 | | fatalerror("32051: unimplemented op or s16 limm at %08X\n", cpustate->pc-1); |
| 575 | fatalerror("32051: unimplemented op or s16 limm at %08X\n", m_pc-1); |
579 | 576 | } |
580 | 577 | |
581 | | static void op_orb(tms32051_state *cpustate) |
| 578 | void tms32051_device::op_orb() |
582 | 579 | { |
583 | | cpustate->acc |= cpustate->accb; |
| 580 | m_acc |= m_accb; |
584 | 581 | |
585 | 582 | CYCLES(1); |
586 | 583 | } |
587 | 584 | |
588 | | static void op_rol(tms32051_state *cpustate) |
| 585 | void tms32051_device::op_rol() |
589 | 586 | { |
590 | | fatalerror("32051: unimplemented op rol at %08X\n", cpustate->pc-1); |
| 587 | fatalerror("32051: unimplemented op rol at %08X\n", m_pc-1); |
591 | 588 | } |
592 | 589 | |
593 | | static void op_rolb(tms32051_state *cpustate) |
| 590 | void tms32051_device::op_rolb() |
594 | 591 | { |
595 | | UINT32 acc = cpustate->acc; |
596 | | UINT32 accb = cpustate->accb; |
597 | | UINT32 c = cpustate->st1.c & 1; |
| 592 | UINT32 acc = m_acc; |
| 593 | UINT32 accb = m_accb; |
| 594 | UINT32 c = m_st1.c & 1; |
598 | 595 | |
599 | | cpustate->acc = (acc << 1) | ((accb >> 31) & 1); |
600 | | cpustate->accb = (accb << 1) | c; |
601 | | cpustate->st1.c = (acc >> 31) & 1; |
| 596 | m_acc = (acc << 1) | ((accb >> 31) & 1); |
| 597 | m_accb = (accb << 1) | c; |
| 598 | m_st1.c = (acc >> 31) & 1; |
602 | 599 | |
603 | 600 | CYCLES(1); |
604 | 601 | } |
605 | 602 | |
606 | | static void op_ror(tms32051_state *cpustate) |
| 603 | void tms32051_device::op_ror() |
607 | 604 | { |
608 | | fatalerror("32051: unimplemented op ror at %08X\n", cpustate->pc-1); |
| 605 | fatalerror("32051: unimplemented op ror at %08X\n", m_pc-1); |
609 | 606 | } |
610 | 607 | |
611 | | static void op_rorb(tms32051_state *cpustate) |
| 608 | void tms32051_device::op_rorb() |
612 | 609 | { |
613 | | fatalerror("32051: unimplemented op rorb at %08X\n", cpustate->pc-1); |
| 610 | fatalerror("32051: unimplemented op rorb at %08X\n", m_pc-1); |
614 | 611 | } |
615 | 612 | |
616 | | static void op_sacb(tms32051_state *cpustate) |
| 613 | void tms32051_device::op_sacb() |
617 | 614 | { |
618 | | cpustate->accb = cpustate->acc; |
| 615 | m_accb = m_acc; |
619 | 616 | |
620 | 617 | CYCLES(1); |
621 | 618 | } |
622 | 619 | |
623 | | static void op_sach(tms32051_state *cpustate) |
| 620 | void tms32051_device::op_sach() |
624 | 621 | { |
625 | | UINT16 ea = GET_ADDRESS(cpustate); |
626 | | int shift = (cpustate->op >> 8) & 0x7; |
| 622 | UINT16 ea = GET_ADDRESS(); |
| 623 | int shift = (m_op >> 8) & 0x7; |
627 | 624 | |
628 | | DM_WRITE16(cpustate, ea, (UINT16)((cpustate->acc << shift) >> 16)); |
| 625 | DM_WRITE16(ea, (UINT16)((m_acc << shift) >> 16)); |
629 | 626 | CYCLES(1); |
630 | 627 | } |
631 | 628 | |
632 | | static void op_sacl(tms32051_state *cpustate) |
| 629 | void tms32051_device::op_sacl() |
633 | 630 | { |
634 | | UINT16 ea = GET_ADDRESS(cpustate); |
635 | | int shift = (cpustate->op >> 8) & 0x7; |
| 631 | UINT16 ea = GET_ADDRESS(); |
| 632 | int shift = (m_op >> 8) & 0x7; |
636 | 633 | |
637 | | DM_WRITE16(cpustate, ea, (UINT16)(cpustate->acc << shift)); |
| 634 | DM_WRITE16(ea, (UINT16)(m_acc << shift)); |
638 | 635 | CYCLES(1); |
639 | 636 | } |
640 | 637 | |
641 | | static void op_samm(tms32051_state *cpustate) |
| 638 | void tms32051_device::op_samm() |
642 | 639 | { |
643 | | UINT16 ea = GET_ADDRESS(cpustate); |
| 640 | UINT16 ea = GET_ADDRESS(); |
644 | 641 | ea &= 0x7f; |
645 | 642 | |
646 | | DM_WRITE16(cpustate, ea, (UINT16)(cpustate->acc)); |
| 643 | DM_WRITE16(ea, (UINT16)(m_acc)); |
647 | 644 | CYCLES(1); |
648 | 645 | } |
649 | 646 | |
650 | | static void op_sath(tms32051_state *cpustate) |
| 647 | void tms32051_device::op_sath() |
651 | 648 | { |
652 | | fatalerror("32051: unimplemented op sath at %08X\n", cpustate->pc-1); |
| 649 | fatalerror("32051: unimplemented op sath at %08X\n", m_pc-1); |
653 | 650 | } |
654 | 651 | |
655 | | static void op_satl(tms32051_state *cpustate) |
| 652 | void tms32051_device::op_satl() |
656 | 653 | { |
657 | | fatalerror("32051: unimplemented op satl at %08X\n", cpustate->pc-1); |
| 654 | fatalerror("32051: unimplemented op satl at %08X\n", m_pc-1); |
658 | 655 | } |
659 | 656 | |
660 | | static void op_sbb(tms32051_state *cpustate) |
| 657 | void tms32051_device::op_sbb() |
661 | 658 | { |
662 | | cpustate->acc = SUB(cpustate, cpustate->acc, cpustate->accb); |
| 659 | m_acc = SUB(m_acc, m_accb); |
663 | 660 | |
664 | 661 | CYCLES(1); |
665 | 662 | } |
666 | 663 | |
667 | | static void op_sbbb(tms32051_state *cpustate) |
| 664 | void tms32051_device::op_sbbb() |
668 | 665 | { |
669 | | fatalerror("32051: unimplemented op sbbb at %08X\n", cpustate->pc-1); |
| 666 | fatalerror("32051: unimplemented op sbbb at %08X\n", m_pc-1); |
670 | 667 | } |
671 | 668 | |
672 | | static void op_sfl(tms32051_state *cpustate) |
| 669 | void tms32051_device::op_sfl() |
673 | 670 | { |
674 | | cpustate->st1.c = (cpustate->acc >> 31) & 1; |
675 | | cpustate->acc = cpustate->acc << 1; |
| 671 | m_st1.c = (m_acc >> 31) & 1; |
| 672 | m_acc = m_acc << 1; |
676 | 673 | |
677 | 674 | CYCLES(1); |
678 | 675 | } |
679 | 676 | |
680 | | static void op_sflb(tms32051_state *cpustate) |
| 677 | void tms32051_device::op_sflb() |
681 | 678 | { |
682 | | UINT32 acc = cpustate->acc; |
683 | | UINT32 accb = cpustate->accb; |
| 679 | UINT32 acc = m_acc; |
| 680 | UINT32 accb = m_accb; |
684 | 681 | |
685 | | cpustate->acc = (acc << 1) | ((accb >> 31) & 1); |
686 | | cpustate->accb = (accb << 1); |
687 | | cpustate->st1.c = (acc >> 31) & 1; |
| 682 | m_acc = (acc << 1) | ((accb >> 31) & 1); |
| 683 | m_accb = (accb << 1); |
| 684 | m_st1.c = (acc >> 31) & 1; |
688 | 685 | |
689 | 686 | CYCLES(1); |
690 | 687 | } |
691 | 688 | |
692 | | static void op_sfr(tms32051_state *cpustate) |
| 689 | void tms32051_device::op_sfr() |
693 | 690 | { |
694 | | cpustate->st1.c = cpustate->acc & 1; |
| 691 | m_st1.c = m_acc & 1; |
695 | 692 | |
696 | | if (cpustate->st1.sxm) |
| 693 | if (m_st1.sxm) |
697 | 694 | { |
698 | | cpustate->acc = (INT32)(cpustate->acc) >> 1; |
| 695 | m_acc = (INT32)(m_acc) >> 1; |
699 | 696 | } |
700 | 697 | else |
701 | 698 | { |
702 | | cpustate->acc = (UINT32)(cpustate->acc) >> 1; |
| 699 | m_acc = (UINT32)(m_acc) >> 1; |
703 | 700 | } |
704 | 701 | |
705 | 702 | CYCLES(1); |
706 | 703 | } |
707 | 704 | |
708 | | static void op_sfrb(tms32051_state *cpustate) |
| 705 | void tms32051_device::op_sfrb() |
709 | 706 | { |
710 | | fatalerror("32051: unimplemented op sfrb at %08X\n", cpustate->pc-1); |
| 707 | fatalerror("32051: unimplemented op sfrb at %08X\n", m_pc-1); |
711 | 708 | } |
712 | 709 | |
713 | | static void op_sub_mem(tms32051_state *cpustate) |
| 710 | void tms32051_device::op_sub_mem() |
714 | 711 | { |
715 | 712 | INT32 d; |
716 | | UINT16 ea = GET_ADDRESS(cpustate); |
717 | | UINT16 data = DM_READ16(cpustate, ea); |
718 | | int shift = (cpustate->op >> 8) & 0xf; |
| 713 | UINT16 ea = GET_ADDRESS(); |
| 714 | UINT16 data = DM_READ16(ea); |
| 715 | int shift = (m_op >> 8) & 0xf; |
719 | 716 | |
720 | | if (cpustate->st1.sxm) |
| 717 | if (m_st1.sxm) |
721 | 718 | { |
722 | 719 | d = (INT32)(INT16)(data) << shift; |
723 | 720 | } |
r26840 | r26841 | |
726 | 723 | d = (UINT32)(UINT16)(data) << shift; |
727 | 724 | } |
728 | 725 | |
729 | | cpustate->acc = SUB(cpustate, cpustate->acc, d); |
| 726 | m_acc = SUB(m_acc, d); |
730 | 727 | |
731 | 728 | CYCLES(1); |
732 | 729 | } |
733 | 730 | |
734 | | static void op_sub_s16_mem(tms32051_state *cpustate) |
| 731 | void tms32051_device::op_sub_s16_mem() |
735 | 732 | { |
736 | | fatalerror("32051: unimplemented op sub s16 mem at %08X\n", cpustate->pc-1); |
| 733 | fatalerror("32051: unimplemented op sub s16 mem at %08X\n", m_pc-1); |
737 | 734 | } |
738 | 735 | |
739 | | static void op_sub_simm(tms32051_state *cpustate) |
| 736 | void tms32051_device::op_sub_simm() |
740 | 737 | { |
741 | | UINT16 imm = cpustate->op & 0xff; |
| 738 | UINT16 imm = m_op & 0xff; |
742 | 739 | |
743 | | cpustate->acc = SUB(cpustate, cpustate->acc, imm); |
| 740 | m_acc = SUB(m_acc, imm); |
744 | 741 | |
745 | 742 | CYCLES(1); |
746 | 743 | } |
747 | 744 | |
748 | | static void op_sub_limm(tms32051_state *cpustate) |
| 745 | void tms32051_device::op_sub_limm() |
749 | 746 | { |
750 | 747 | INT32 d; |
751 | | UINT16 imm = ROPCODE(cpustate); |
752 | | int shift = cpustate->op & 0xf; |
| 748 | UINT16 imm = ROPCODE(); |
| 749 | int shift = m_op & 0xf; |
753 | 750 | |
754 | | if (cpustate->st1.sxm) |
| 751 | if (m_st1.sxm) |
755 | 752 | { |
756 | 753 | d = (INT32)(INT16)(imm) << shift; |
757 | 754 | } |
r26840 | r26841 | |
760 | 757 | d = (UINT32)(UINT16)(imm) << shift; |
761 | 758 | } |
762 | 759 | |
763 | | cpustate->acc = SUB(cpustate, cpustate->acc, d); |
| 760 | m_acc = SUB(m_acc, d); |
764 | 761 | |
765 | 762 | CYCLES(2); |
766 | 763 | } |
767 | 764 | |
768 | | static void op_subb(tms32051_state *cpustate) |
| 765 | void tms32051_device::op_subb() |
769 | 766 | { |
770 | | fatalerror("32051: unimplemented op subb at %08X\n", cpustate->pc-1); |
| 767 | fatalerror("32051: unimplemented op subb at %08X\n", m_pc-1); |
771 | 768 | } |
772 | 769 | |
773 | | static void op_subc(tms32051_state *cpustate) |
| 770 | void tms32051_device::op_subc() |
774 | 771 | { |
775 | | fatalerror("32051: unimplemented op subc at %08X\n", cpustate->pc-1); |
| 772 | fatalerror("32051: unimplemented op subc at %08X\n", m_pc-1); |
776 | 773 | } |
777 | 774 | |
778 | | static void op_subs(tms32051_state *cpustate) |
| 775 | void tms32051_device::op_subs() |
779 | 776 | { |
780 | | fatalerror("32051: unimplemented op subs at %08X\n", cpustate->pc-1); |
| 777 | fatalerror("32051: unimplemented op subs at %08X\n", m_pc-1); |
781 | 778 | } |
782 | 779 | |
783 | | static void op_subt(tms32051_state *cpustate) |
| 780 | void tms32051_device::op_subt() |
784 | 781 | { |
785 | | fatalerror("32051: unimplemented op subt at %08X\n", cpustate->pc-1); |
| 782 | fatalerror("32051: unimplemented op subt at %08X\n", m_pc-1); |
786 | 783 | } |
787 | 784 | |
788 | | static void op_xor_mem(tms32051_state *cpustate) |
| 785 | void tms32051_device::op_xor_mem() |
789 | 786 | { |
790 | | UINT16 ea = GET_ADDRESS(cpustate); |
791 | | UINT16 data = DM_READ16(cpustate, ea); |
| 787 | UINT16 ea = GET_ADDRESS(); |
| 788 | UINT16 data = DM_READ16(ea); |
792 | 789 | |
793 | | cpustate->acc ^= (UINT32)(data); |
| 790 | m_acc ^= (UINT32)(data); |
794 | 791 | |
795 | 792 | CYCLES(1); |
796 | 793 | } |
797 | 794 | |
798 | | static void op_xor_limm(tms32051_state *cpustate) |
| 795 | void tms32051_device::op_xor_limm() |
799 | 796 | { |
800 | | UINT32 imm = ROPCODE(cpustate); |
801 | | int shift = cpustate->op & 0xf; |
| 797 | UINT32 imm = ROPCODE(); |
| 798 | int shift = m_op & 0xf; |
802 | 799 | |
803 | | cpustate->acc ^= imm << shift; |
| 800 | m_acc ^= imm << shift; |
804 | 801 | |
805 | 802 | CYCLES(1); |
806 | 803 | } |
807 | 804 | |
808 | | static void op_xor_s16_limm(tms32051_state *cpustate) |
| 805 | void tms32051_device::op_xor_s16_limm() |
809 | 806 | { |
810 | | fatalerror("32051: unimplemented op xor s16 limm at %08X\n", cpustate->pc-1); |
| 807 | fatalerror("32051: unimplemented op xor s16 limm at %08X\n", m_pc-1); |
811 | 808 | } |
812 | 809 | |
813 | | static void op_xorb(tms32051_state *cpustate) |
| 810 | void tms32051_device::op_xorb() |
814 | 811 | { |
815 | | fatalerror("32051: unimplemented op xorb at %08X\n", cpustate->pc-1); |
| 812 | fatalerror("32051: unimplemented op xorb at %08X\n", m_pc-1); |
816 | 813 | } |
817 | 814 | |
818 | | static void op_zalr(tms32051_state *cpustate) |
| 815 | void tms32051_device::op_zalr() |
819 | 816 | { |
820 | | fatalerror("32051: unimplemented op zalr at %08X\n", cpustate->pc-1); |
| 817 | fatalerror("32051: unimplemented op zalr at %08X\n", m_pc-1); |
821 | 818 | } |
822 | 819 | |
823 | | static void op_zap(tms32051_state *cpustate) |
| 820 | void tms32051_device::op_zap() |
824 | 821 | { |
825 | | cpustate->acc = 0; |
826 | | cpustate->preg = 0; |
| 822 | m_acc = 0; |
| 823 | m_preg = 0; |
827 | 824 | |
828 | 825 | CYCLES(1); |
829 | 826 | } |
830 | 827 | |
831 | 828 | /*****************************************************************************/ |
832 | 829 | |
833 | | static void op_adrk(tms32051_state *cpustate) |
| 830 | void tms32051_device::op_adrk() |
834 | 831 | { |
835 | | UINT16 imm = cpustate->op & 0xff; |
836 | | UPDATE_AR(cpustate, cpustate->st0.arp, imm); |
| 832 | UINT16 imm = m_op & 0xff; |
| 833 | UPDATE_AR(m_st0.arp, imm); |
837 | 834 | |
838 | 835 | CYCLES(1); |
839 | 836 | } |
840 | 837 | |
841 | | static void op_cmpr(tms32051_state *cpustate) |
| 838 | void tms32051_device::op_cmpr() |
842 | 839 | { |
843 | | cpustate->st1.tc = 0; |
| 840 | m_st1.tc = 0; |
844 | 841 | |
845 | | switch (cpustate->op & 0x3) |
| 842 | switch (m_op & 0x3) |
846 | 843 | { |
847 | 844 | case 0: // (CurrentAR) == ARCR |
848 | 845 | { |
849 | | if (cpustate->ar[cpustate->st0.arp] == cpustate->arcr) |
| 846 | if (m_ar[m_st0.arp] == m_arcr) |
850 | 847 | { |
851 | | cpustate->st1.tc = 1; |
| 848 | m_st1.tc = 1; |
852 | 849 | } |
853 | 850 | break; |
854 | 851 | } |
855 | 852 | case 1: // (CurrentAR) < ARCR |
856 | 853 | { |
857 | | if (cpustate->ar[cpustate->st0.arp] < cpustate->arcr) |
| 854 | if (m_ar[m_st0.arp] < m_arcr) |
858 | 855 | { |
859 | | cpustate->st1.tc = 1; |
| 856 | m_st1.tc = 1; |
860 | 857 | } |
861 | 858 | break; |
862 | 859 | } |
863 | 860 | case 2: // (CurrentAR) > ARCR |
864 | 861 | { |
865 | | if (cpustate->ar[cpustate->st0.arp] > cpustate->arcr) |
| 862 | if (m_ar[m_st0.arp] > m_arcr) |
866 | 863 | { |
867 | | cpustate->st1.tc = 1; |
| 864 | m_st1.tc = 1; |
868 | 865 | } |
869 | 866 | break; |
870 | 867 | } |
871 | 868 | case 3: // (CurrentAR) != ARCR |
872 | 869 | { |
873 | | if (cpustate->ar[cpustate->st0.arp] != cpustate->arcr) |
| 870 | if (m_ar[m_st0.arp] != m_arcr) |
874 | 871 | { |
875 | | cpustate->st1.tc = 1; |
| 872 | m_st1.tc = 1; |
876 | 873 | } |
877 | 874 | break; |
878 | 875 | } |
r26840 | r26841 | |
881 | 878 | CYCLES(1); |
882 | 879 | } |
883 | 880 | |
884 | | static void op_lar_mem(tms32051_state *cpustate) |
| 881 | void tms32051_device::op_lar_mem() |
885 | 882 | { |
886 | | int arx = (cpustate->op >> 8) & 0x7; |
887 | | UINT16 ea = GET_ADDRESS(cpustate); |
888 | | UINT16 data = DM_READ16(cpustate, ea); |
| 883 | int arx = (m_op >> 8) & 0x7; |
| 884 | UINT16 ea = GET_ADDRESS(); |
| 885 | UINT16 data = DM_READ16(ea); |
889 | 886 | |
890 | | cpustate->ar[arx] = data; |
| 887 | m_ar[arx] = data; |
891 | 888 | |
892 | 889 | CYCLES(2); |
893 | 890 | } |
894 | 891 | |
895 | | static void op_lar_simm(tms32051_state *cpustate) |
| 892 | void tms32051_device::op_lar_simm() |
896 | 893 | { |
897 | | int arx = (cpustate->op >> 8) & 0x7; |
898 | | cpustate->ar[arx] = cpustate->op & 0xff; |
| 894 | int arx = (m_op >> 8) & 0x7; |
| 895 | m_ar[arx] = m_op & 0xff; |
899 | 896 | |
900 | 897 | CYCLES(2); |
901 | 898 | } |
902 | 899 | |
903 | | static void op_lar_limm(tms32051_state *cpustate) |
| 900 | void tms32051_device::op_lar_limm() |
904 | 901 | { |
905 | | int arx = cpustate->op & 0x7; |
906 | | UINT16 imm = ROPCODE(cpustate); |
907 | | cpustate->ar[arx] = imm; |
| 902 | int arx = m_op & 0x7; |
| 903 | UINT16 imm = ROPCODE(); |
| 904 | m_ar[arx] = imm; |
908 | 905 | |
909 | 906 | CYCLES(2); |
910 | 907 | } |
911 | 908 | |
912 | | static void op_ldp_mem(tms32051_state *cpustate) |
| 909 | void tms32051_device::op_ldp_mem() |
913 | 910 | { |
914 | | fatalerror("32051: unimplemented op ldp mem at %08X\n", cpustate->pc-1); |
| 911 | fatalerror("32051: unimplemented op ldp mem at %08X\n", m_pc-1); |
915 | 912 | } |
916 | 913 | |
917 | | static void op_ldp_imm(tms32051_state *cpustate) |
| 914 | void tms32051_device::op_ldp_imm() |
918 | 915 | { |
919 | | cpustate->st0.dp = (cpustate->op & 0x1ff) << 7; |
| 916 | m_st0.dp = (m_op & 0x1ff) << 7; |
920 | 917 | CYCLES(2); |
921 | 918 | } |
922 | 919 | |
923 | | static void op_mar(tms32051_state *cpustate) |
| 920 | void tms32051_device::op_mar() |
924 | 921 | { |
925 | 922 | // direct addressing is NOP |
926 | | if (cpustate->op & 0x80) |
| 923 | if (m_op & 0x80) |
927 | 924 | { |
928 | | GET_ADDRESS(cpustate); |
| 925 | GET_ADDRESS(); |
929 | 926 | } |
930 | 927 | CYCLES(1); |
931 | 928 | } |
932 | 929 | |
933 | | static void op_sar(tms32051_state *cpustate) |
| 930 | void tms32051_device::op_sar() |
934 | 931 | { |
935 | | int arx = (cpustate->op >> 8) & 0x7; |
936 | | UINT16 ar = cpustate->ar[arx]; |
937 | | UINT16 ea = GET_ADDRESS(cpustate); |
938 | | DM_WRITE16(cpustate, ea, ar); |
| 932 | int arx = (m_op >> 8) & 0x7; |
| 933 | UINT16 ar = m_ar[arx]; |
| 934 | UINT16 ea = GET_ADDRESS(); |
| 935 | DM_WRITE16(ea, ar); |
939 | 936 | |
940 | 937 | CYCLES(1); |
941 | 938 | } |
942 | 939 | |
943 | | static void op_sbrk(tms32051_state *cpustate) |
| 940 | void tms32051_device::op_sbrk() |
944 | 941 | { |
945 | | UINT16 imm = cpustate->op & 0xff; |
946 | | UPDATE_AR(cpustate, cpustate->st0.arp, -imm); |
| 942 | UINT16 imm = m_op & 0xff; |
| 943 | UPDATE_AR(m_st0.arp, -imm); |
947 | 944 | |
948 | 945 | CYCLES(1); |
949 | 946 | } |
950 | 947 | |
951 | 948 | /*****************************************************************************/ |
952 | 949 | |
953 | | static void op_b(tms32051_state *cpustate) |
| 950 | void tms32051_device::op_b() |
954 | 951 | { |
955 | | UINT16 pma = ROPCODE(cpustate); |
956 | | GET_ADDRESS(cpustate); // update AR/ARP |
| 952 | UINT16 pma = ROPCODE(); |
| 953 | GET_ADDRESS(); // update AR/ARP |
957 | 954 | |
958 | | CHANGE_PC(cpustate, pma); |
| 955 | CHANGE_PC(pma); |
959 | 956 | CYCLES(4); |
960 | 957 | } |
961 | 958 | |
962 | | static void op_bacc(tms32051_state *cpustate) |
| 959 | void tms32051_device::op_bacc() |
963 | 960 | { |
964 | | CHANGE_PC(cpustate, (UINT16)(cpustate->acc)); |
| 961 | CHANGE_PC((UINT16)(m_acc)); |
965 | 962 | |
966 | 963 | CYCLES(4); |
967 | 964 | } |
968 | 965 | |
969 | | static void op_baccd(tms32051_state *cpustate) |
| 966 | void tms32051_device::op_baccd() |
970 | 967 | { |
971 | | UINT16 pc = (UINT16)(cpustate->acc); |
| 968 | UINT16 pc = (UINT16)(m_acc); |
972 | 969 | |
973 | | delay_slot(cpustate, cpustate->pc); |
974 | | CHANGE_PC(cpustate, pc); |
| 970 | delay_slot(m_pc); |
| 971 | CHANGE_PC(pc); |
975 | 972 | |
976 | 973 | CYCLES(2); |
977 | 974 | } |
978 | 975 | |
979 | | static void op_banz(tms32051_state *cpustate) |
| 976 | void tms32051_device::op_banz() |
980 | 977 | { |
981 | | UINT16 pma = ROPCODE(cpustate); |
| 978 | UINT16 pma = ROPCODE(); |
982 | 979 | |
983 | | if (cpustate->ar[cpustate->st0.arp] != 0) |
| 980 | if (m_ar[m_st0.arp] != 0) |
984 | 981 | { |
985 | | CHANGE_PC(cpustate, pma); |
| 982 | CHANGE_PC(pma); |
986 | 983 | CYCLES(4); |
987 | 984 | } |
988 | 985 | else |
r26840 | r26841 | |
990 | 987 | CYCLES(2); |
991 | 988 | } |
992 | 989 | |
993 | | GET_ADDRESS(cpustate); // modify AR/ARP |
| 990 | GET_ADDRESS(); // modify AR/ARP |
994 | 991 | } |
995 | 992 | |
996 | | static void op_banzd(tms32051_state *cpustate) |
| 993 | void tms32051_device::op_banzd() |
997 | 994 | { |
998 | | fatalerror("32051: unimplemented op banzd at %08X\n", cpustate->pc-1); |
| 995 | fatalerror("32051: unimplemented op banzd at %08X\n", m_pc-1); |
999 | 996 | } |
1000 | 997 | |
1001 | | static void op_bcnd(tms32051_state *cpustate) |
| 998 | void tms32051_device::op_bcnd() |
1002 | 999 | { |
1003 | | UINT16 pma = ROPCODE(cpustate); |
| 1000 | UINT16 pma = ROPCODE(); |
1004 | 1001 | |
1005 | | if (GET_ZLVC_CONDITION(cpustate, (cpustate->op >> 4) & 0xf, cpustate->op & 0xf) || GET_TP_CONDITION(cpustate, (cpustate->op >> 8) & 0x3)) |
| 1002 | if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3)) |
1006 | 1003 | { |
1007 | | CHANGE_PC(cpustate, pma); |
| 1004 | CHANGE_PC(pma); |
1008 | 1005 | CYCLES(4); |
1009 | 1006 | } |
1010 | 1007 | else |
r26840 | r26841 | |
1013 | 1010 | } |
1014 | 1011 | } |
1015 | 1012 | |
1016 | | static void op_bcndd(tms32051_state *cpustate) |
| 1013 | void tms32051_device::op_bcndd() |
1017 | 1014 | { |
1018 | | UINT16 pma = ROPCODE(cpustate); |
| 1015 | UINT16 pma = ROPCODE(); |
1019 | 1016 | |
1020 | | if (GET_ZLVC_CONDITION(cpustate, (cpustate->op >> 4) & 0xf, cpustate->op & 0xf) || GET_TP_CONDITION(cpustate, (cpustate->op >> 8) & 0x3)) |
| 1017 | if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3)) |
1021 | 1018 | { |
1022 | | delay_slot(cpustate, cpustate->pc); |
1023 | | CHANGE_PC(cpustate, pma); |
| 1019 | delay_slot(m_pc); |
| 1020 | CHANGE_PC(pma); |
1024 | 1021 | CYCLES(4); |
1025 | 1022 | } |
1026 | 1023 | else |
r26840 | r26841 | |
1029 | 1026 | } |
1030 | 1027 | } |
1031 | 1028 | |
1032 | | static void op_bd(tms32051_state *cpustate) |
| 1029 | void tms32051_device::op_bd() |
1033 | 1030 | { |
1034 | | UINT16 pma = ROPCODE(cpustate); |
1035 | | GET_ADDRESS(cpustate); // update AR/ARP |
| 1031 | UINT16 pma = ROPCODE(); |
| 1032 | GET_ADDRESS(); // update AR/ARP |
1036 | 1033 | |
1037 | | delay_slot(cpustate, cpustate->pc); |
1038 | | CHANGE_PC(cpustate, pma); |
| 1034 | delay_slot(m_pc); |
| 1035 | CHANGE_PC(pma); |
1039 | 1036 | CYCLES(2); |
1040 | 1037 | } |
1041 | 1038 | |
1042 | | static void op_cala(tms32051_state *cpustate) |
| 1039 | void tms32051_device::op_cala() |
1043 | 1040 | { |
1044 | | PUSH_STACK(cpustate, cpustate->pc); |
| 1041 | PUSH_STACK(m_pc); |
1045 | 1042 | |
1046 | | CHANGE_PC(cpustate, cpustate->acc); |
| 1043 | CHANGE_PC(m_acc); |
1047 | 1044 | |
1048 | 1045 | CYCLES(4); |
1049 | 1046 | } |
1050 | 1047 | |
1051 | | static void op_calad(tms32051_state *cpustate) |
| 1048 | void tms32051_device::op_calad() |
1052 | 1049 | { |
1053 | | UINT16 pma = cpustate->acc; |
1054 | | PUSH_STACK(cpustate, cpustate->pc+2); |
| 1050 | UINT16 pma = m_acc; |
| 1051 | PUSH_STACK(m_pc+2); |
1055 | 1052 | |
1056 | | delay_slot(cpustate, cpustate->pc); |
1057 | | CHANGE_PC(cpustate, pma); |
| 1053 | delay_slot(m_pc); |
| 1054 | CHANGE_PC(pma); |
1058 | 1055 | |
1059 | 1056 | CYCLES(4); |
1060 | 1057 | } |
1061 | 1058 | |
1062 | | static void op_call(tms32051_state *cpustate) |
| 1059 | void tms32051_device::op_call() |
1063 | 1060 | { |
1064 | | UINT16 pma = ROPCODE(cpustate); |
1065 | | GET_ADDRESS(cpustate); // update AR/ARP |
1066 | | PUSH_STACK(cpustate, cpustate->pc); |
| 1061 | UINT16 pma = ROPCODE(); |
| 1062 | GET_ADDRESS(); // update AR/ARP |
| 1063 | PUSH_STACK(m_pc); |
1067 | 1064 | |
1068 | | CHANGE_PC(cpustate, pma); |
| 1065 | CHANGE_PC(pma); |
1069 | 1066 | |
1070 | 1067 | CYCLES(4); |
1071 | 1068 | } |
1072 | 1069 | |
1073 | | static void op_calld(tms32051_state *cpustate) |
| 1070 | void tms32051_device::op_calld() |
1074 | 1071 | { |
1075 | | UINT16 pma = ROPCODE(cpustate); |
1076 | | GET_ADDRESS(cpustate); // update AR/ARP |
1077 | | PUSH_STACK(cpustate, cpustate->pc+2); |
| 1072 | UINT16 pma = ROPCODE(); |
| 1073 | GET_ADDRESS(); // update AR/ARP |
| 1074 | PUSH_STACK(m_pc+2); |
1078 | 1075 | |
1079 | | delay_slot(cpustate, cpustate->pc); |
1080 | | CHANGE_PC(cpustate, pma); |
| 1076 | delay_slot(m_pc); |
| 1077 | CHANGE_PC(pma); |
1081 | 1078 | |
1082 | 1079 | CYCLES(4); |
1083 | 1080 | } |
1084 | 1081 | |
1085 | | static void op_cc(tms32051_state *cpustate) |
| 1082 | void tms32051_device::op_cc() |
1086 | 1083 | { |
1087 | | fatalerror("32051: unimplemented op cc at %08X\n", cpustate->pc-1); |
| 1084 | fatalerror("32051: unimplemented op cc at %08X\n", m_pc-1); |
1088 | 1085 | } |
1089 | 1086 | |
1090 | | static void op_ccd(tms32051_state *cpustate) |
| 1087 | void tms32051_device::op_ccd() |
1091 | 1088 | { |
1092 | | UINT16 pma = ROPCODE(cpustate); |
| 1089 | UINT16 pma = ROPCODE(); |
1093 | 1090 | |
1094 | | if (GET_ZLVC_CONDITION(cpustate, (cpustate->op >> 4) & 0xf, cpustate->op & 0xf) || GET_TP_CONDITION(cpustate, (cpustate->op >> 8) & 0x3)) |
| 1091 | if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3)) |
1095 | 1092 | { |
1096 | | PUSH_STACK(cpustate, cpustate->pc+2); |
| 1093 | PUSH_STACK(m_pc+2); |
1097 | 1094 | |
1098 | | delay_slot(cpustate, cpustate->pc); |
1099 | | CHANGE_PC(cpustate, pma); |
| 1095 | delay_slot(m_pc); |
| 1096 | CHANGE_PC(pma); |
1100 | 1097 | } |
1101 | 1098 | |
1102 | 1099 | CYCLES(2); |
1103 | 1100 | } |
1104 | 1101 | |
1105 | | static void op_intr(tms32051_state *cpustate) |
| 1102 | void tms32051_device::op_intr() |
1106 | 1103 | { |
1107 | | fatalerror("32051: unimplemented op intr at %08X\n", cpustate->pc-1); |
| 1104 | fatalerror("32051: unimplemented op intr at %08X\n", m_pc-1); |
1108 | 1105 | } |
1109 | 1106 | |
1110 | | static void op_nmi(tms32051_state *cpustate) |
| 1107 | void tms32051_device::op_nmi() |
1111 | 1108 | { |
1112 | | fatalerror("32051: unimplemented op nmi at %08X\n", cpustate->pc-1); |
| 1109 | fatalerror("32051: unimplemented op nmi at %08X\n", m_pc-1); |
1113 | 1110 | } |
1114 | 1111 | |
1115 | | static void op_retc(tms32051_state *cpustate) |
| 1112 | void tms32051_device::op_retc() |
1116 | 1113 | { |
1117 | | if ((cpustate->op & 0x3ff) == 0x300 || GET_ZLVC_CONDITION(cpustate, (cpustate->op >> 4) & 0xf, cpustate->op & 0xf) || GET_TP_CONDITION(cpustate, (cpustate->op >> 8) & 0x3)) |
| 1114 | if ((m_op & 0x3ff) == 0x300 || GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3)) |
1118 | 1115 | { |
1119 | | UINT16 pc = POP_STACK(cpustate); |
1120 | | CHANGE_PC(cpustate, pc); |
| 1116 | UINT16 pc = POP_STACK(); |
| 1117 | CHANGE_PC(pc); |
1121 | 1118 | CYCLES(4); |
1122 | 1119 | } |
1123 | 1120 | else |
r26840 | r26841 | |
1126 | 1123 | } |
1127 | 1124 | } |
1128 | 1125 | |
1129 | | static void op_retcd(tms32051_state *cpustate) |
| 1126 | void tms32051_device::op_retcd() |
1130 | 1127 | { |
1131 | | if ((cpustate->op & 0x3ff) == 0x300 || GET_ZLVC_CONDITION(cpustate, (cpustate->op >> 4) & 0xf, cpustate->op & 0xf) || GET_TP_CONDITION(cpustate, (cpustate->op >> 8) & 0x3)) |
| 1128 | if ((m_op & 0x3ff) == 0x300 || GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3)) |
1132 | 1129 | { |
1133 | | UINT16 pc = POP_STACK(cpustate); |
1134 | | delay_slot(cpustate, cpustate->pc); |
1135 | | CHANGE_PC(cpustate, pc); |
| 1130 | UINT16 pc = POP_STACK(); |
| 1131 | delay_slot(m_pc); |
| 1132 | CHANGE_PC(pc); |
1136 | 1133 | CYCLES(4); |
1137 | 1134 | } |
1138 | 1135 | else |
r26840 | r26841 | |
1141 | 1138 | } |
1142 | 1139 | } |
1143 | 1140 | |
1144 | | static void op_rete(tms32051_state *cpustate) |
| 1141 | void tms32051_device::op_rete() |
1145 | 1142 | { |
1146 | | UINT16 pc = POP_STACK(cpustate); |
1147 | | CHANGE_PC(cpustate, pc); |
| 1143 | UINT16 pc = POP_STACK(); |
| 1144 | CHANGE_PC(pc); |
1148 | 1145 | |
1149 | | cpustate->st0.intm = 0; |
| 1146 | m_st0.intm = 0; |
1150 | 1147 | |
1151 | | restore_interrupt_context(cpustate); |
| 1148 | restore_interrupt_context(); |
1152 | 1149 | |
1153 | 1150 | CYCLES(4); |
1154 | 1151 | } |
1155 | 1152 | |
1156 | | static void op_reti(tms32051_state *cpustate) |
| 1153 | void tms32051_device::op_reti() |
1157 | 1154 | { |
1158 | | fatalerror("32051: unimplemented op reti at %08X\n", cpustate->pc-1); |
| 1155 | fatalerror("32051: unimplemented op reti at %08X\n", m_pc-1); |
1159 | 1156 | } |
1160 | 1157 | |
1161 | | static void op_trap(tms32051_state *cpustate) |
| 1158 | void tms32051_device::op_trap() |
1162 | 1159 | { |
1163 | | fatalerror("32051: unimplemented op trap at %08X\n", cpustate->pc-1); |
| 1160 | fatalerror("32051: unimplemented op trap at %08X\n", m_pc-1); |
1164 | 1161 | } |
1165 | 1162 | |
1166 | | static void op_xc(tms32051_state *cpustate) |
| 1163 | void tms32051_device::op_xc() |
1167 | 1164 | { |
1168 | | if (GET_ZLVC_CONDITION(cpustate, (cpustate->op >> 4) & 0xf, cpustate->op & 0xf) || GET_TP_CONDITION(cpustate, (cpustate->op >> 8) & 0x3)) |
| 1165 | if (GET_ZLVC_CONDITION((m_op >> 4) & 0xf, m_op & 0xf) || GET_TP_CONDITION((m_op >> 8) & 0x3)) |
1169 | 1166 | { |
1170 | 1167 | CYCLES(1); |
1171 | 1168 | } |
1172 | 1169 | else |
1173 | 1170 | { |
1174 | | int n = ((cpustate->op >> 12) & 0x1) + 1; |
1175 | | CHANGE_PC(cpustate, cpustate->pc + n); |
| 1171 | int n = ((m_op >> 12) & 0x1) + 1; |
| 1172 | CHANGE_PC(m_pc + n); |
1176 | 1173 | CYCLES(1 + n); |
1177 | 1174 | } |
1178 | 1175 | } |
1179 | 1176 | |
1180 | 1177 | /*****************************************************************************/ |
1181 | 1178 | |
1182 | | static void op_bldd_slimm(tms32051_state *cpustate) |
| 1179 | void tms32051_device::op_bldd_slimm() |
1183 | 1180 | { |
1184 | | UINT16 pfc = ROPCODE(cpustate); |
| 1181 | UINT16 pfc = ROPCODE(); |
1185 | 1182 | |
1186 | | while (cpustate->rptc > -1) |
| 1183 | while (m_rptc > -1) |
1187 | 1184 | { |
1188 | | UINT16 ea = GET_ADDRESS(cpustate); |
1189 | | UINT16 data = DM_READ16(cpustate, pfc); |
1190 | | DM_WRITE16(cpustate, ea, data); |
| 1185 | UINT16 ea = GET_ADDRESS(); |
| 1186 | UINT16 data = DM_READ16(pfc); |
| 1187 | DM_WRITE16(ea, data); |
1191 | 1188 | pfc++; |
1192 | 1189 | CYCLES(2); |
1193 | 1190 | |
1194 | | cpustate->rptc--; |
| 1191 | m_rptc--; |
1195 | 1192 | }; |
1196 | 1193 | } |
1197 | 1194 | |
1198 | | static void op_bldd_dlimm(tms32051_state *cpustate) |
| 1195 | void tms32051_device::op_bldd_dlimm() |
1199 | 1196 | { |
1200 | | UINT16 pfc = ROPCODE(cpustate); |
| 1197 | UINT16 pfc = ROPCODE(); |
1201 | 1198 | |
1202 | | while (cpustate->rptc > -1) |
| 1199 | while (m_rptc > -1) |
1203 | 1200 | { |
1204 | | UINT16 ea = GET_ADDRESS(cpustate); |
1205 | | UINT16 data = DM_READ16(cpustate, ea); |
1206 | | DM_WRITE16(cpustate, pfc, data); |
| 1201 | UINT16 ea = GET_ADDRESS(); |
| 1202 | UINT16 data = DM_READ16(ea); |
| 1203 | DM_WRITE16(pfc, data); |
1207 | 1204 | pfc++; |
1208 | 1205 | CYCLES(2); |
1209 | 1206 | |
1210 | | cpustate->rptc--; |
| 1207 | m_rptc--; |
1211 | 1208 | }; |
1212 | 1209 | } |
1213 | 1210 | |
1214 | | static void op_bldd_sbmar(tms32051_state *cpustate) |
| 1211 | void tms32051_device::op_bldd_sbmar() |
1215 | 1212 | { |
1216 | | fatalerror("32051: unimplemented op bldd sbmar at %08X\n", cpustate->pc-1); |
| 1213 | fatalerror("32051: unimplemented op bldd sbmar at %08X\n", m_pc-1); |
1217 | 1214 | } |
1218 | 1215 | |
1219 | | static void op_bldd_dbmar(tms32051_state *cpustate) |
| 1216 | void tms32051_device::op_bldd_dbmar() |
1220 | 1217 | { |
1221 | | UINT16 pfc = cpustate->bmar; |
| 1218 | UINT16 pfc = m_bmar; |
1222 | 1219 | |
1223 | | while (cpustate->rptc > -1) |
| 1220 | while (m_rptc > -1) |
1224 | 1221 | { |
1225 | | UINT16 ea = GET_ADDRESS(cpustate); |
1226 | | UINT16 data = DM_READ16(cpustate, ea); |
1227 | | DM_WRITE16(cpustate, pfc, data); |
| 1222 | UINT16 ea = GET_ADDRESS(); |
| 1223 | UINT16 data = DM_READ16(ea); |
| 1224 | DM_WRITE16(pfc, data); |
1228 | 1225 | pfc++; |
1229 | 1226 | CYCLES(2); |
1230 | 1227 | |
1231 | | cpustate->rptc--; |
| 1228 | m_rptc--; |
1232 | 1229 | }; |
1233 | 1230 | } |
1234 | 1231 | |
1235 | | static void op_bldp(tms32051_state *cpustate) |
| 1232 | void tms32051_device::op_bldp() |
1236 | 1233 | { |
1237 | | UINT16 pfc = cpustate->bmar; |
| 1234 | UINT16 pfc = m_bmar; |
1238 | 1235 | |
1239 | | while (cpustate->rptc > -1) |
| 1236 | while (m_rptc > -1) |
1240 | 1237 | { |
1241 | | UINT16 ea = GET_ADDRESS(cpustate); |
1242 | | UINT16 data = DM_READ16(cpustate, ea); |
1243 | | PM_WRITE16(cpustate, pfc, data); |
| 1238 | UINT16 ea = GET_ADDRESS(); |
| 1239 | UINT16 data = DM_READ16(ea); |
| 1240 | PM_WRITE16(pfc, data); |
1244 | 1241 | pfc++; |
1245 | 1242 | CYCLES(1); |
1246 | 1243 | |
1247 | | cpustate->rptc--; |
| 1244 | m_rptc--; |
1248 | 1245 | }; |
1249 | 1246 | } |
1250 | 1247 | |
1251 | | static void op_blpd_bmar(tms32051_state *cpustate) |
| 1248 | void tms32051_device::op_blpd_bmar() |
1252 | 1249 | { |
1253 | | fatalerror("32051: unimplemented op bpld bmar at %08X\n", cpustate->pc-1); |
| 1250 | fatalerror("32051: unimplemented op bpld bmar at %08X\n", m_pc-1); |
1254 | 1251 | } |
1255 | 1252 | |
1256 | | static void op_blpd_imm(tms32051_state *cpustate) |
| 1253 | void tms32051_device::op_blpd_imm() |
1257 | 1254 | { |
1258 | | UINT16 pfc = ROPCODE(cpustate); |
| 1255 | UINT16 pfc = ROPCODE(); |
1259 | 1256 | |
1260 | | while (cpustate->rptc > -1) |
| 1257 | while (m_rptc > -1) |
1261 | 1258 | { |
1262 | | UINT16 ea = GET_ADDRESS(cpustate); |
1263 | | UINT16 data = PM_READ16(cpustate, pfc); |
1264 | | DM_WRITE16(cpustate, ea, data); |
| 1259 | UINT16 ea = GET_ADDRESS(); |
| 1260 | UINT16 data = PM_READ16(pfc); |
| 1261 | DM_WRITE16(ea, data); |
1265 | 1262 | pfc++; |
1266 | 1263 | CYCLES(2); |
1267 | 1264 | |
1268 | | cpustate->rptc--; |
| 1265 | m_rptc--; |
1269 | 1266 | }; |
1270 | 1267 | } |
1271 | 1268 | |
1272 | 1269 | /*****************************************************************************/ |
1273 | 1270 | |
1274 | | static void op_dmov(tms32051_state *cpustate) |
| 1271 | void tms32051_device::op_dmov() |
1275 | 1272 | { |
1276 | | fatalerror("32051: unimplemented op dmov at %08X\n", cpustate->pc-1); |
| 1273 | fatalerror("32051: unimplemented op dmov at %08X\n", m_pc-1); |
1277 | 1274 | } |
1278 | 1275 | |
1279 | | static void op_in(tms32051_state *cpustate) |
| 1276 | void tms32051_device::op_in() |
1280 | 1277 | { |
1281 | | fatalerror("32051: unimplemented op in at %08X\n", cpustate->pc-1); |
| 1278 | fatalerror("32051: unimplemented op in at %08X\n", m_pc-1); |
1282 | 1279 | } |
1283 | 1280 | |
1284 | | static void op_lmmr(tms32051_state *cpustate) |
| 1281 | void tms32051_device::op_lmmr() |
1285 | 1282 | { |
1286 | | UINT16 pfc = ROPCODE(cpustate); |
| 1283 | UINT16 pfc = ROPCODE(); |
1287 | 1284 | |
1288 | | while (cpustate->rptc > -1) |
| 1285 | while (m_rptc > -1) |
1289 | 1286 | { |
1290 | | UINT16 ea = GET_ADDRESS(cpustate); |
1291 | | UINT16 data = DM_READ16(cpustate, pfc); |
1292 | | DM_WRITE16(cpustate, ea & 0x7f, data); |
| 1287 | UINT16 ea = GET_ADDRESS(); |
| 1288 | UINT16 data = DM_READ16(pfc); |
| 1289 | DM_WRITE16(ea & 0x7f, data); |
1293 | 1290 | pfc++; |
1294 | 1291 | CYCLES(2); |
1295 | 1292 | |
1296 | | cpustate->rptc--; |
| 1293 | m_rptc--; |
1297 | 1294 | }; |
1298 | 1295 | } |
1299 | 1296 | |
1300 | | static void op_out(tms32051_state *cpustate) |
| 1297 | void tms32051_device::op_out() |
1301 | 1298 | { |
1302 | | fatalerror("32051: unimplemented op out at %08X\n", cpustate->pc-1); |
| 1299 | fatalerror("32051: unimplemented op out at %08X\n", m_pc-1); |
1303 | 1300 | } |
1304 | 1301 | |
1305 | | static void op_smmr(tms32051_state *cpustate) |
| 1302 | void tms32051_device::op_smmr() |
1306 | 1303 | { |
1307 | | UINT16 pfc = ROPCODE(cpustate); |
| 1304 | UINT16 pfc = ROPCODE(); |
1308 | 1305 | |
1309 | | while (cpustate->rptc > -1) |
| 1306 | while (m_rptc > -1) |
1310 | 1307 | { |
1311 | | UINT16 ea = GET_ADDRESS(cpustate); |
1312 | | UINT16 data = DM_READ16(cpustate, ea & 0x7f); |
1313 | | DM_WRITE16(cpustate, pfc, data); |
| 1308 | UINT16 ea = GET_ADDRESS(); |
| 1309 | UINT16 data = DM_READ16(ea & 0x7f); |
| 1310 | DM_WRITE16(pfc, data); |
1314 | 1311 | pfc++; |
1315 | 1312 | CYCLES(2); |
1316 | 1313 | |
1317 | | cpustate->rptc--; |
| 1314 | m_rptc--; |
1318 | 1315 | }; |
1319 | 1316 | } |
1320 | 1317 | |
1321 | | static void op_tblr(tms32051_state *cpustate) |
| 1318 | void tms32051_device::op_tblr() |
1322 | 1319 | { |
1323 | | UINT16 pfc = (UINT16)(cpustate->acc); |
| 1320 | UINT16 pfc = (UINT16)(m_acc); |
1324 | 1321 | |
1325 | | while (cpustate->rptc > -1) |
| 1322 | while (m_rptc > -1) |
1326 | 1323 | { |
1327 | | UINT16 ea = GET_ADDRESS(cpustate); |
1328 | | UINT16 data = PM_READ16(cpustate, pfc); |
1329 | | DM_WRITE16(cpustate, ea, data); |
| 1324 | UINT16 ea = GET_ADDRESS(); |
| 1325 | UINT16 data = PM_READ16(pfc); |
| 1326 | DM_WRITE16(ea, data); |
1330 | 1327 | pfc++; |
1331 | 1328 | CYCLES(2); |
1332 | 1329 | |
1333 | | cpustate->rptc--; |
| 1330 | m_rptc--; |
1334 | 1331 | }; |
1335 | 1332 | } |
1336 | 1333 | |
1337 | | static void op_tblw(tms32051_state *cpustate) |
| 1334 | void tms32051_device::op_tblw() |
1338 | 1335 | { |
1339 | | UINT16 pfc = (UINT16)(cpustate->acc); |
| 1336 | UINT16 pfc = (UINT16)(m_acc); |
1340 | 1337 | |
1341 | | while (cpustate->rptc > -1) |
| 1338 | while (m_rptc > -1) |
1342 | 1339 | { |
1343 | | UINT16 ea = GET_ADDRESS(cpustate); |
1344 | | UINT16 data = DM_READ16(cpustate, ea); |
1345 | | PM_WRITE16(cpustate, pfc, data); |
| 1340 | UINT16 ea = GET_ADDRESS(); |
| 1341 | UINT16 data = DM_READ16(ea); |
| 1342 | PM_WRITE16(pfc, data); |
1346 | 1343 | pfc++; |
1347 | 1344 | CYCLES(2); |
1348 | 1345 | |
1349 | | cpustate->rptc--; |
| 1346 | m_rptc--; |
1350 | 1347 | }; |
1351 | 1348 | } |
1352 | 1349 | |
1353 | 1350 | /*****************************************************************************/ |
1354 | 1351 | |
1355 | | static void op_apl_dbmr(tms32051_state *cpustate) |
| 1352 | void tms32051_device::op_apl_dbmr() |
1356 | 1353 | { |
1357 | | UINT16 ea = GET_ADDRESS(cpustate); |
1358 | | UINT16 data = DM_READ16(cpustate, ea); |
1359 | | data &= cpustate->dbmr; |
1360 | | DM_WRITE16(cpustate, ea, data); |
| 1354 | UINT16 ea = GET_ADDRESS(); |
| 1355 | UINT16 data = DM_READ16(ea); |
| 1356 | data &= m_dbmr; |
| 1357 | DM_WRITE16(ea, data); |
1361 | 1358 | CYCLES(1); |
1362 | 1359 | } |
1363 | 1360 | |
1364 | | static void op_apl_imm(tms32051_state *cpustate) |
| 1361 | void tms32051_device::op_apl_imm() |
1365 | 1362 | { |
1366 | | UINT16 ea = GET_ADDRESS(cpustate); |
1367 | | UINT16 imm = ROPCODE(cpustate); |
1368 | | UINT16 data = DM_READ16(cpustate, ea); |
| 1363 | UINT16 ea = GET_ADDRESS(); |
| 1364 | UINT16 imm = ROPCODE(); |
| 1365 | UINT16 data = DM_READ16(ea); |
1369 | 1366 | data &= imm; |
1370 | | DM_WRITE16(cpustate, ea, data); |
| 1367 | DM_WRITE16(ea, data); |
1371 | 1368 | CYCLES(1); |
1372 | 1369 | } |
1373 | 1370 | |
1374 | | static void op_cpl_dbmr(tms32051_state *cpustate) |
| 1371 | void tms32051_device::op_cpl_dbmr() |
1375 | 1372 | { |
1376 | | fatalerror("32051: unimplemented op cpl dbmr at %08X\n", cpustate->pc-1); |
| 1373 | fatalerror("32051: unimplemented op cpl dbmr at %08X\n", m_pc-1); |
1377 | 1374 | } |
1378 | 1375 | |
1379 | | static void op_cpl_imm(tms32051_state *cpustate) |
| 1376 | void tms32051_device::op_cpl_imm() |
1380 | 1377 | { |
1381 | | UINT16 imm = ROPCODE(cpustate); |
1382 | | UINT16 ea = GET_ADDRESS(cpustate); |
1383 | | UINT16 data = DM_READ16(cpustate, ea); |
| 1378 | UINT16 imm = ROPCODE(); |
| 1379 | UINT16 ea = GET_ADDRESS(); |
| 1380 | UINT16 data = DM_READ16(ea); |
1384 | 1381 | |
1385 | | cpustate->st1.tc = (data == imm) ? 1 : 0; |
| 1382 | m_st1.tc = (data == imm) ? 1 : 0; |
1386 | 1383 | |
1387 | 1384 | CYCLES(1); |
1388 | 1385 | } |
1389 | 1386 | |
1390 | | static void op_opl_dbmr(tms32051_state *cpustate) |
| 1387 | void tms32051_device::op_opl_dbmr() |
1391 | 1388 | { |
1392 | | UINT16 ea = GET_ADDRESS(cpustate); |
1393 | | UINT16 data = DM_READ16(cpustate, ea); |
1394 | | data |= cpustate->dbmr; |
1395 | | DM_WRITE16(cpustate, ea, data); |
| 1389 | UINT16 ea = GET_ADDRESS(); |
| 1390 | UINT16 data = DM_READ16(ea); |
| 1391 | data |= m_dbmr; |
| 1392 | DM_WRITE16(ea, data); |
1396 | 1393 | CYCLES(1); |
1397 | 1394 | } |
1398 | 1395 | |
1399 | | static void op_opl_imm(tms32051_state *cpustate) |
| 1396 | void tms32051_device::op_opl_imm() |
1400 | 1397 | { |
1401 | | UINT16 ea = GET_ADDRESS(cpustate); |
1402 | | UINT16 imm = ROPCODE(cpustate); |
1403 | | UINT16 data = DM_READ16(cpustate, ea); |
| 1398 | UINT16 ea = GET_ADDRESS(); |
| 1399 | UINT16 imm = ROPCODE(); |
| 1400 | UINT16 data = DM_READ16(ea); |
1404 | 1401 | data |= imm; |
1405 | | DM_WRITE16(cpustate, ea, data); |
| 1402 | DM_WRITE16(ea, data); |
1406 | 1403 | CYCLES(1); |
1407 | 1404 | } |
1408 | 1405 | |
1409 | | static void op_splk(tms32051_state *cpustate) |
| 1406 | void tms32051_device::op_splk() |
1410 | 1407 | { |
1411 | | UINT16 ea = GET_ADDRESS(cpustate); |
1412 | | UINT16 imm = ROPCODE(cpustate); |
| 1408 | UINT16 ea = GET_ADDRESS(); |
| 1409 | UINT16 imm = ROPCODE(); |
1413 | 1410 | |
1414 | | DM_WRITE16(cpustate, ea, imm); |
| 1411 | DM_WRITE16(ea, imm); |
1415 | 1412 | |
1416 | 1413 | CYCLES(2); |
1417 | 1414 | } |
1418 | 1415 | |
1419 | | static void op_xpl_dbmr(tms32051_state *cpustate) |
| 1416 | void tms32051_device::op_xpl_dbmr() |
1420 | 1417 | { |
1421 | | fatalerror("32051: unimplemented op xpl dbmr at %08X\n", cpustate->pc-1); |
| 1418 | fatalerror("32051: unimplemented op xpl dbmr at %08X\n", m_pc-1); |
1422 | 1419 | } |
1423 | 1420 | |
1424 | | static void op_xpl_imm(tms32051_state *cpustate) |
| 1421 | void tms32051_device::op_xpl_imm() |
1425 | 1422 | { |
1426 | | fatalerror("32051: unimplemented op xpl imm at %08X\n", cpustate->pc-1); |
| 1423 | fatalerror("32051: unimplemented op xpl imm at %08X\n", m_pc-1); |
1427 | 1424 | } |
1428 | 1425 | |
1429 | | static void op_apac(tms32051_state *cpustate) |
| 1426 | void tms32051_device::op_apac() |
1430 | 1427 | { |
1431 | | INT32 spreg = PREG_PSCALER(cpustate, cpustate->preg); |
1432 | | cpustate->acc = ADD(cpustate, cpustate->acc, spreg); |
| 1428 | INT32 spreg = PREG_PSCALER(m_preg); |
| 1429 | m_acc = ADD(m_acc, spreg); |
1433 | 1430 | |
1434 | 1431 | CYCLES(1); |
1435 | 1432 | } |
1436 | 1433 | |
1437 | | static void op_lph(tms32051_state *cpustate) |
| 1434 | void tms32051_device::op_lph() |
1438 | 1435 | { |
1439 | | fatalerror("32051: unimplemented op lph at %08X\n", cpustate->pc-1); |
| 1436 | fatalerror("32051: unimplemented op lph at %08X\n", m_pc-1); |
1440 | 1437 | } |
1441 | 1438 | |
1442 | | static void op_lt(tms32051_state *cpustate) |
| 1439 | void tms32051_device::op_lt() |
1443 | 1440 | { |
1444 | | UINT16 ea = GET_ADDRESS(cpustate); |
1445 | | UINT16 data = DM_READ16(cpustate, ea); |
| 1441 | UINT16 ea = GET_ADDRESS(); |
| 1442 | UINT16 data = DM_READ16(ea); |
1446 | 1443 | |
1447 | | cpustate->treg0 = data; |
1448 | | if (cpustate->pmst.trm == 0) |
| 1444 | m_treg0 = data; |
| 1445 | if (m_pmst.trm == 0) |
1449 | 1446 | { |
1450 | | cpustate->treg1 = data; |
1451 | | cpustate->treg2 = data; |
| 1447 | m_treg1 = data; |
| 1448 | m_treg2 = data; |
1452 | 1449 | } |
1453 | 1450 | |
1454 | 1451 | CYCLES(1); |
1455 | 1452 | } |
1456 | 1453 | |
1457 | | static void op_lta(tms32051_state *cpustate) |
| 1454 | void tms32051_device::op_lta() |
1458 | 1455 | { |
1459 | 1456 | INT32 spreg; |
1460 | | UINT16 ea = GET_ADDRESS(cpustate); |
1461 | | UINT16 data = DM_READ16(cpustate, ea); |
| 1457 | UINT16 ea = GET_ADDRESS(); |
| 1458 | UINT16 data = DM_READ16(ea); |
1462 | 1459 | |
1463 | | cpustate->treg0 = data; |
1464 | | spreg = PREG_PSCALER(cpustate, cpustate->preg); |
1465 | | cpustate->acc = ADD(cpustate, cpustate->acc, spreg); |
1466 | | if (cpustate->pmst.trm == 0) |
| 1460 | m_treg0 = data; |
| 1461 | spreg = PREG_PSCALER(m_preg); |
| 1462 | m_acc = ADD(m_acc, spreg); |
| 1463 | if (m_pmst.trm == 0) |
1467 | 1464 | { |
1468 | | cpustate->treg1 = data; |
1469 | | cpustate->treg2 = data; |
| 1465 | m_treg1 = data; |
| 1466 | m_treg2 = data; |
1470 | 1467 | } |
1471 | 1468 | |
1472 | 1469 | CYCLES(1); |
1473 | 1470 | } |
1474 | 1471 | |
1475 | | static void op_ltd(tms32051_state *cpustate) |
| 1472 | void tms32051_device::op_ltd() |
1476 | 1473 | { |
1477 | | fatalerror("32051: unimplemented op ltd at %08X\n", cpustate->pc-1); |
| 1474 | fatalerror("32051: unimplemented op ltd at %08X\n", m_pc-1); |
1478 | 1475 | } |
1479 | 1476 | |
1480 | | static void op_ltp(tms32051_state *cpustate) |
| 1477 | void tms32051_device::op_ltp() |
1481 | 1478 | { |
1482 | | fatalerror("32051: unimplemented op ltp at %08X\n", cpustate->pc-1); |
| 1479 | fatalerror("32051: unimplemented op ltp at %08X\n", m_pc-1); |
1483 | 1480 | } |
1484 | 1481 | |
1485 | | static void op_lts(tms32051_state *cpustate) |
| 1482 | void tms32051_device::op_lts() |
1486 | 1483 | { |
1487 | | fatalerror("32051: unimplemented op lts at %08X\n", cpustate->pc-1); |
| 1484 | fatalerror("32051: unimplemented op lts at %08X\n", m_pc-1); |
1488 | 1485 | } |
1489 | 1486 | |
1490 | | static void op_mac(tms32051_state *cpustate) |
| 1487 | void tms32051_device::op_mac() |
1491 | 1488 | { |
1492 | | fatalerror("32051: unimplemented op mac at %08X\n", cpustate->pc-1); |
| 1489 | fatalerror("32051: unimplemented op mac at %08X\n", m_pc-1); |
1493 | 1490 | } |
1494 | 1491 | |
1495 | | static void op_macd(tms32051_state *cpustate) |
| 1492 | void tms32051_device::op_macd() |
1496 | 1493 | { |
1497 | | fatalerror("32051: unimplemented op macd at %08X\n", cpustate->pc-1); |
| 1494 | fatalerror("32051: unimplemented op macd at %08X\n", m_pc-1); |
1498 | 1495 | } |
1499 | 1496 | |
1500 | | static void op_madd(tms32051_state *cpustate) |
| 1497 | void tms32051_device::op_madd() |
1501 | 1498 | { |
1502 | | fatalerror("32051: unimplemented op madd at %08X\n", cpustate->pc-1); |
| 1499 | fatalerror("32051: unimplemented op madd at %08X\n", m_pc-1); |
1503 | 1500 | } |
1504 | 1501 | |
1505 | | static void op_mads(tms32051_state *cpustate) |
| 1502 | void tms32051_device::op_mads() |
1506 | 1503 | { |
1507 | | fatalerror("32051: unimplemented op mads at %08X\n", cpustate->pc-1); |
| 1504 | fatalerror("32051: unimplemented op mads at %08X\n", m_pc-1); |
1508 | 1505 | } |
1509 | 1506 | |
1510 | | static void op_mpy_mem(tms32051_state *cpustate) |
| 1507 | void tms32051_device::op_mpy_mem() |
1511 | 1508 | { |
1512 | | UINT16 ea = GET_ADDRESS(cpustate); |
1513 | | INT16 data = DM_READ16(cpustate, ea); |
| 1509 | UINT16 ea = GET_ADDRESS(); |
| 1510 | INT16 data = DM_READ16(ea); |
1514 | 1511 | |
1515 | | cpustate->preg = (INT32)(data) * (INT32)(INT16)(cpustate->treg0); |
| 1512 | m_preg = (INT32)(data) * (INT32)(INT16)(m_treg0); |
1516 | 1513 | |
1517 | 1514 | CYCLES(1); |
1518 | 1515 | } |
1519 | 1516 | |
1520 | | static void op_mpy_simm(tms32051_state *cpustate) |
| 1517 | void tms32051_device::op_mpy_simm() |
1521 | 1518 | { |
1522 | | fatalerror("32051: unimplemented op mpy simm at %08X\n", cpustate->pc-1); |
| 1519 | fatalerror("32051: unimplemented op mpy simm at %08X\n", m_pc-1); |
1523 | 1520 | } |
1524 | 1521 | |
1525 | | static void op_mpy_limm(tms32051_state *cpustate) |
| 1522 | void tms32051_device::op_mpy_limm() |
1526 | 1523 | { |
1527 | | fatalerror("32051: unimplemented op mpy limm at %08X\n", cpustate->pc-1); |
| 1524 | fatalerror("32051: unimplemented op mpy limm at %08X\n", m_pc-1); |
1528 | 1525 | } |
1529 | 1526 | |
1530 | | static void op_mpya(tms32051_state *cpustate) |
| 1527 | void tms32051_device::op_mpya() |
1531 | 1528 | { |
1532 | | fatalerror("32051: unimplemented op mpya at %08X\n", cpustate->pc-1); |
| 1529 | fatalerror("32051: unimplemented op mpya at %08X\n", m_pc-1); |
1533 | 1530 | } |
1534 | 1531 | |
1535 | | static void op_mpys(tms32051_state *cpustate) |
| 1532 | void tms32051_device::op_mpys() |
1536 | 1533 | { |
1537 | | fatalerror("32051: unimplemented op mpys at %08X\n", cpustate->pc-1); |
| 1534 | fatalerror("32051: unimplemented op mpys at %08X\n", m_pc-1); |
1538 | 1535 | } |
1539 | 1536 | |
1540 | | static void op_mpyu(tms32051_state *cpustate) |
| 1537 | void tms32051_device::op_mpyu() |
1541 | 1538 | { |
1542 | | fatalerror("32051: unimplemented op mpyu at %08X\n", cpustate->pc-1); |
| 1539 | fatalerror("32051: unimplemented op mpyu at %08X\n", m_pc-1); |
1543 | 1540 | } |
1544 | 1541 | |
1545 | | static void op_pac(tms32051_state *cpustate) |
| 1542 | void tms32051_device::op_pac() |
1546 | 1543 | { |
1547 | | fatalerror("32051: unimplemented op pac at %08X\n", cpustate->pc-1); |
| 1544 | fatalerror("32051: unimplemented op pac at %08X\n", m_pc-1); |
1548 | 1545 | } |
1549 | 1546 | |
1550 | | static void op_spac(tms32051_state *cpustate) |
| 1547 | void tms32051_device::op_spac() |
1551 | 1548 | { |
1552 | | fatalerror("32051: unimplemented op spac at %08X\n", cpustate->pc-1); |
| 1549 | fatalerror("32051: unimplemented op spac at %08X\n", m_pc-1); |
1553 | 1550 | } |
1554 | 1551 | |
1555 | | static void op_sph(tms32051_state *cpustate) |
| 1552 | void tms32051_device::op_sph() |
1556 | 1553 | { |
1557 | | UINT16 ea = GET_ADDRESS(cpustate); |
1558 | | UINT16 spreg = (UINT16)(PREG_PSCALER(cpustate, cpustate->preg) >> 16); |
1559 | | DM_WRITE16(cpustate, ea, spreg); |
| 1554 | UINT16 ea = GET_ADDRESS(); |
| 1555 | UINT16 spreg = (UINT16)(PREG_PSCALER(m_preg) >> 16); |
| 1556 | DM_WRITE16(ea, spreg); |
1560 | 1557 | |
1561 | 1558 | CYCLES(1); |
1562 | 1559 | } |
1563 | 1560 | |
1564 | | static void op_spl(tms32051_state *cpustate) |
| 1561 | void tms32051_device::op_spl() |
1565 | 1562 | { |
1566 | | fatalerror("32051: unimplemented op spl at %08X\n", cpustate->pc-1); |
| 1563 | fatalerror("32051: unimplemented op spl at %08X\n", m_pc-1); |
1567 | 1564 | } |
1568 | 1565 | |
1569 | | static void op_spm(tms32051_state *cpustate) |
| 1566 | void tms32051_device::op_spm() |
1570 | 1567 | { |
1571 | | cpustate->st1.pm = cpustate->op & 0x3; |
| 1568 | m_st1.pm = m_op & 0x3; |
1572 | 1569 | |
1573 | 1570 | CYCLES(1); |
1574 | 1571 | } |
1575 | 1572 | |
1576 | | static void op_sqra(tms32051_state *cpustate) |
| 1573 | void tms32051_device::op_sqra() |
1577 | 1574 | { |
1578 | | fatalerror("32051: unimplemented op sqra at %08X\n", cpustate->pc-1); |
| 1575 | fatalerror("32051: unimplemented op sqra at %08X\n", m_pc-1); |
1579 | 1576 | } |
1580 | 1577 | |
1581 | | static void op_sqrs(tms32051_state *cpustate) |
| 1578 | void tms32051_device::op_sqrs() |
1582 | 1579 | { |
1583 | | fatalerror("32051: unimplemented op sqrs at %08X\n", cpustate->pc-1); |
| 1580 | fatalerror("32051: unimplemented op sqrs at %08X\n", m_pc-1); |
1584 | 1581 | } |
1585 | 1582 | |
1586 | | static void op_zpr(tms32051_state *cpustate) |
| 1583 | void tms32051_device::op_zpr() |
1587 | 1584 | { |
1588 | | fatalerror("32051: unimplemented op zpr at %08X\n", cpustate->pc-1); |
| 1585 | fatalerror("32051: unimplemented op zpr at %08X\n", m_pc-1); |
1589 | 1586 | } |
1590 | 1587 | |
1591 | | static void op_bit(tms32051_state *cpustate) |
| 1588 | void tms32051_device::op_bit() |
1592 | 1589 | { |
1593 | | UINT16 ea = GET_ADDRESS(cpustate); |
1594 | | UINT16 data = DM_READ16(cpustate, ea); |
| 1590 | UINT16 ea = GET_ADDRESS(); |
| 1591 | UINT16 data = DM_READ16(ea); |
1595 | 1592 | |
1596 | | cpustate->st1.tc = (data >> (~cpustate->op >> 8 & 0xf)) & 1; |
| 1593 | m_st1.tc = (data >> (~m_op >> 8 & 0xf)) & 1; |
1597 | 1594 | |
1598 | 1595 | CYCLES(1); |
1599 | 1596 | } |
1600 | 1597 | |
1601 | | static void op_bitt(tms32051_state *cpustate) |
| 1598 | void tms32051_device::op_bitt() |
1602 | 1599 | { |
1603 | | UINT16 ea = GET_ADDRESS(cpustate); |
1604 | | UINT16 data = DM_READ16(cpustate, ea); |
| 1600 | UINT16 ea = GET_ADDRESS(); |
| 1601 | UINT16 data = DM_READ16(ea); |
1605 | 1602 | |
1606 | | cpustate->st1.tc = (data >> (~cpustate->treg2 & 0xf)) & 1; |
| 1603 | m_st1.tc = (data >> (~m_treg2 & 0xf)) & 1; |
1607 | 1604 | |
1608 | 1605 | CYCLES(1); |
1609 | 1606 | } |
1610 | 1607 | |
1611 | | static void op_clrc_ov(tms32051_state *cpustate) |
| 1608 | void tms32051_device::op_clrc_ov() |
1612 | 1609 | { |
1613 | | cpustate->st0.ovm = 0; |
| 1610 | m_st0.ovm = 0; |
1614 | 1611 | |
1615 | 1612 | CYCLES(1); |
1616 | 1613 | } |
1617 | 1614 | |
1618 | | static void op_clrc_ext(tms32051_state *cpustate) |
| 1615 | void tms32051_device::op_clrc_ext() |
1619 | 1616 | { |
1620 | | cpustate->st1.sxm = 0; |
| 1617 | m_st1.sxm = 0; |
1621 | 1618 | |
1622 | 1619 | CYCLES(1); |
1623 | 1620 | } |
1624 | 1621 | |
1625 | | static void op_clrc_hold(tms32051_state *cpustate) |
| 1622 | void tms32051_device::op_clrc_hold() |
1626 | 1623 | { |
1627 | | fatalerror("32051: unimplemented op clrc hold at %08X\n", cpustate->pc-1); |
| 1624 | fatalerror("32051: unimplemented op clrc hold at %08X\n", m_pc-1); |
1628 | 1625 | } |
1629 | 1626 | |
1630 | | static void op_clrc_tc(tms32051_state *cpustate) |
| 1627 | void tms32051_device::op_clrc_tc() |
1631 | 1628 | { |
1632 | | fatalerror("32051: unimplemented op clrc tc at %08X\n", cpustate->pc-1); |
| 1629 | fatalerror("32051: unimplemented op clrc tc at %08X\n", m_pc-1); |
1633 | 1630 | } |
1634 | 1631 | |
1635 | | static void op_clrc_carry(tms32051_state *cpustate) |
| 1632 | void tms32051_device::op_clrc_carry() |
1636 | 1633 | { |
1637 | | fatalerror("32051: unimplemented op clrc carry at %08X\n", cpustate->pc-1); |
| 1634 | fatalerror("32051: unimplemented op clrc carry at %08X\n", m_pc-1); |
1638 | 1635 | } |
1639 | 1636 | |
1640 | | static void op_clrc_cnf(tms32051_state *cpustate) |
| 1637 | void tms32051_device::op_clrc_cnf() |
1641 | 1638 | { |
1642 | | cpustate->st1.cnf = 0; |
| 1639 | m_st1.cnf = 0; |
1643 | 1640 | |
1644 | 1641 | CYCLES(1); |
1645 | 1642 | } |
1646 | 1643 | |
1647 | | static void op_clrc_intm(tms32051_state *cpustate) |
| 1644 | void tms32051_device::op_clrc_intm() |
1648 | 1645 | { |
1649 | | cpustate->st0.intm = 0; |
| 1646 | m_st0.intm = 0; |
1650 | 1647 | |
1651 | | check_interrupts(cpustate); |
| 1648 | check_interrupts(); |
1652 | 1649 | |
1653 | 1650 | CYCLES(1); |
1654 | 1651 | } |
1655 | 1652 | |
1656 | | static void op_clrc_xf(tms32051_state *cpustate) |
| 1653 | void tms32051_device::op_clrc_xf() |
1657 | 1654 | { |
1658 | | fatalerror("32051: unimplemented op clrc xf at %08X\n", cpustate->pc-1); |
| 1655 | fatalerror("32051: unimplemented op clrc xf at %08X\n", m_pc-1); |
1659 | 1656 | } |
1660 | 1657 | |
1661 | | static void op_idle(tms32051_state *cpustate) |
| 1658 | void tms32051_device::op_idle() |
1662 | 1659 | { |
1663 | | fatalerror("32051: unimplemented op idle at %08X\n", cpustate->pc-1); |
| 1660 | fatalerror("32051: unimplemented op idle at %08X\n", m_pc-1); |
1664 | 1661 | } |
1665 | 1662 | |
1666 | | static void op_idle2(tms32051_state *cpustate) |
| 1663 | void tms32051_device::op_idle2() |
1667 | 1664 | { |
1668 | | fatalerror("32051: unimplemented op idle2 at %08X\n", cpustate->pc-1); |
| 1665 | fatalerror("32051: unimplemented op idle2 at %08X\n", m_pc-1); |
1669 | 1666 | } |
1670 | 1667 | |
1671 | | static void op_lst_st0(tms32051_state *cpustate) |
| 1668 | void tms32051_device::op_lst_st0() |
1672 | 1669 | { |
1673 | | fatalerror("32051: unimplemented op lst st0 at %08X\n", cpustate->pc-1); |
| 1670 | fatalerror("32051: unimplemented op lst st0 at %08X\n", m_pc-1); |
1674 | 1671 | } |
1675 | 1672 | |
1676 | | static void op_lst_st1(tms32051_state *cpustate) |
| 1673 | void tms32051_device::op_lst_st1() |
1677 | 1674 | { |
1678 | | fatalerror("32051: unimplemented op lst st1 at %08X\n", cpustate->pc-1); |
| 1675 | fatalerror("32051: unimplemented op lst st1 at %08X\n", m_pc-1); |
1679 | 1676 | } |
1680 | 1677 | |
1681 | | static void op_pop(tms32051_state *cpustate) |
| 1678 | void tms32051_device::op_pop() |
1682 | 1679 | { |
1683 | | cpustate->acc = POP_STACK(cpustate); |
| 1680 | m_acc = POP_STACK(); |
1684 | 1681 | |
1685 | 1682 | CYCLES(1); |
1686 | 1683 | } |
1687 | 1684 | |
1688 | | static void op_popd(tms32051_state *cpustate) |
| 1685 | void tms32051_device::op_popd() |
1689 | 1686 | { |
1690 | | fatalerror("32051: unimplemented op popd at %08X\n", cpustate->pc-1); |
| 1687 | fatalerror("32051: unimplemented op popd at %08X\n", m_pc-1); |
1691 | 1688 | } |
1692 | 1689 | |
1693 | | static void op_pshd(tms32051_state *cpustate) |
| 1690 | void tms32051_device::op_pshd() |
1694 | 1691 | { |
1695 | | fatalerror("32051: unimplemented op pshd at %08X\n", cpustate->pc-1); |
| 1692 | fatalerror("32051: unimplemented op pshd at %08X\n", m_pc-1); |
1696 | 1693 | } |
1697 | 1694 | |
1698 | | static void op_push(tms32051_state *cpustate) |
| 1695 | void tms32051_device::op_push() |
1699 | 1696 | { |
1700 | | fatalerror("32051: unimplemented op push at %08X\n", cpustate->pc-1); |
| 1697 | fatalerror("32051: unimplemented op push at %08X\n", m_pc-1); |
1701 | 1698 | } |
1702 | 1699 | |
1703 | | static void op_rpt_mem(tms32051_state *cpustate) |
| 1700 | void tms32051_device::op_rpt_mem() |
1704 | 1701 | { |
1705 | | UINT16 ea = GET_ADDRESS(cpustate); |
1706 | | UINT16 data = DM_READ16(cpustate, ea); |
1707 | | cpustate->rptc = data; |
1708 | | cpustate->rpt_start = cpustate->pc; |
1709 | | cpustate->rpt_end = cpustate->pc; |
| 1702 | UINT16 ea = GET_ADDRESS(); |
| 1703 | UINT16 data = DM_READ16(ea); |
| 1704 | m_rptc = data; |
| 1705 | m_rpt_start = m_pc; |
| 1706 | m_rpt_end = m_pc; |
1710 | 1707 | |
1711 | 1708 | CYCLES(1); |
1712 | 1709 | } |
1713 | 1710 | |
1714 | | static void op_rpt_limm(tms32051_state *cpustate) |
| 1711 | void tms32051_device::op_rpt_limm() |
1715 | 1712 | { |
1716 | | cpustate->rptc = (UINT16)ROPCODE(cpustate); |
1717 | | cpustate->rpt_start = cpustate->pc; |
1718 | | cpustate->rpt_end = cpustate->pc; |
| 1713 | m_rptc = (UINT16)ROPCODE(); |
| 1714 | m_rpt_start = m_pc; |
| 1715 | m_rpt_end = m_pc; |
1719 | 1716 | |
1720 | 1717 | CYCLES(2); |
1721 | 1718 | } |
1722 | 1719 | |
1723 | | static void op_rpt_simm(tms32051_state *cpustate) |
| 1720 | void tms32051_device::op_rpt_simm() |
1724 | 1721 | { |
1725 | | cpustate->rptc = (cpustate->op & 0xff); |
1726 | | cpustate->rpt_start = cpustate->pc; |
1727 | | cpustate->rpt_end = cpustate->pc; |
| 1722 | m_rptc = (m_op & 0xff); |
| 1723 | m_rpt_start = m_pc; |
| 1724 | m_rpt_end = m_pc; |
1728 | 1725 | |
1729 | 1726 | CYCLES(1); |
1730 | 1727 | } |
1731 | 1728 | |
1732 | | static void op_rptb(tms32051_state *cpustate) |
| 1729 | void tms32051_device::op_rptb() |
1733 | 1730 | { |
1734 | | UINT16 pma = ROPCODE(cpustate); |
1735 | | cpustate->pmst.braf = 1; |
1736 | | cpustate->pasr = cpustate->pc; |
1737 | | cpustate->paer = pma + 1; |
| 1731 | UINT16 pma = ROPCODE(); |
| 1732 | m_pmst.braf = 1; |
| 1733 | m_pasr = m_pc; |
| 1734 | m_paer = pma + 1; |
1738 | 1735 | |
1739 | 1736 | CYCLES(2); |
1740 | 1737 | } |
1741 | 1738 | |
1742 | | static void op_rptz(tms32051_state *cpustate) |
| 1739 | void tms32051_device::op_rptz() |
1743 | 1740 | { |
1744 | | fatalerror("32051: unimplemented op rptz at %08X\n", cpustate->pc-1); |
| 1741 | fatalerror("32051: unimplemented op rptz at %08X\n", m_pc-1); |
1745 | 1742 | } |
1746 | 1743 | |
1747 | | static void op_setc_ov(tms32051_state *cpustate) |
| 1744 | void tms32051_device::op_setc_ov() |
1748 | 1745 | { |
1749 | | cpustate->st0.ovm = 1; |
| 1746 | m_st0.ovm = 1; |
1750 | 1747 | |
1751 | 1748 | CYCLES(1); |
1752 | 1749 | } |
1753 | 1750 | |
1754 | | static void op_setc_ext(tms32051_state *cpustate) |
| 1751 | void tms32051_device::op_setc_ext() |
1755 | 1752 | { |
1756 | | cpustate->st1.sxm = 1; |
| 1753 | m_st1.sxm = 1; |
1757 | 1754 | |
1758 | 1755 | CYCLES(1); |
1759 | 1756 | } |
1760 | 1757 | |
1761 | | static void op_setc_hold(tms32051_state *cpustate) |
| 1758 | void tms32051_device::op_setc_hold() |
1762 | 1759 | { |
1763 | | fatalerror("32051: unimplemented op setc hold at %08X\n", cpustate->pc-1); |
| 1760 | fatalerror("32051: unimplemented op setc hold at %08X\n", m_pc-1); |
1764 | 1761 | } |
1765 | 1762 | |
1766 | | static void op_setc_tc(tms32051_state *cpustate) |
| 1763 | void tms32051_device::op_setc_tc() |
1767 | 1764 | { |
1768 | | fatalerror("32051: unimplemented op setc tc at %08X\n", cpustate->pc-1); |
| 1765 | fatalerror("32051: unimplemented op setc tc at %08X\n", m_pc-1); |
1769 | 1766 | } |
1770 | 1767 | |
1771 | | static void op_setc_carry(tms32051_state *cpustate) |
| 1768 | void tms32051_device::op_setc_carry() |
1772 | 1769 | { |
1773 | | fatalerror("32051: unimplemented op setc carry at %08X\n", cpustate->pc-1); |
| 1770 | fatalerror("32051: unimplemented op setc carry at %08X\n", m_pc-1); |
1774 | 1771 | } |
1775 | 1772 | |
1776 | | static void op_setc_xf(tms32051_state *cpustate) |
| 1773 | void tms32051_device::op_setc_xf() |
1777 | 1774 | { |
1778 | | fatalerror("32051: unimplemented op setc xf at %08X\n", cpustate->pc-1); |
| 1775 | fatalerror("32051: unimplemented op setc xf at %08X\n", m_pc-1); |
1779 | 1776 | } |
1780 | 1777 | |
1781 | | static void op_setc_cnf(tms32051_state *cpustate) |
| 1778 | void tms32051_device::op_setc_cnf() |
1782 | 1779 | { |
1783 | | cpustate->st1.cnf = 1; |
| 1780 | m_st1.cnf = 1; |
1784 | 1781 | |
1785 | 1782 | CYCLES(1); |
1786 | 1783 | } |
1787 | 1784 | |
1788 | | static void op_setc_intm(tms32051_state *cpustate) |
| 1785 | void tms32051_device::op_setc_intm() |
1789 | 1786 | { |
1790 | | cpustate->st0.intm = 1; |
| 1787 | m_st0.intm = 1; |
1791 | 1788 | |
1792 | | check_interrupts(cpustate); |
| 1789 | check_interrupts(); |
1793 | 1790 | |
1794 | 1791 | CYCLES(1); |
1795 | 1792 | } |
1796 | 1793 | |
1797 | | static void op_sst_st0(tms32051_state *cpustate) |
| 1794 | void tms32051_device::op_sst_st0() |
1798 | 1795 | { |
1799 | | fatalerror("32051: unimplemented op sst st0 at %08X\n", cpustate->pc-1); |
| 1796 | fatalerror("32051: unimplemented op sst st0 at %08X\n", m_pc-1); |
1800 | 1797 | } |
1801 | 1798 | |
1802 | | static void op_sst_st1(tms32051_state *cpustate) |
| 1799 | void tms32051_device::op_sst_st1() |
1803 | 1800 | { |
1804 | | fatalerror("32051: unimplemented op sst st1 at %08X\n", cpustate->pc-1); |
| 1801 | fatalerror("32051: unimplemented op sst st1 at %08X\n", m_pc-1); |
1805 | 1802 | } |
trunk/src/emu/cpu/tms32051/tms32051.c
r26840 | r26841 | |
46 | 46 | TMS32051_AR7, |
47 | 47 | }; |
48 | 48 | |
49 | | struct PMST |
50 | | { |
51 | | UINT16 iptr; |
52 | | UINT16 avis; |
53 | | UINT16 ovly; |
54 | | UINT16 ram; |
55 | | UINT16 mpmc; |
56 | | UINT16 ndx; |
57 | | UINT16 trm; |
58 | | UINT16 braf; |
59 | | }; |
60 | 49 | |
61 | | struct ST0 |
62 | | { |
63 | | UINT16 dp; |
64 | | UINT16 intm; |
65 | | UINT16 ovm; |
66 | | UINT16 ov; |
67 | | UINT16 arp; |
68 | | }; |
| 50 | const device_type TMS32051 = &device_creator<tms32051_device>; |
69 | 51 | |
70 | | struct ST1 |
71 | | { |
72 | | UINT16 arb; |
73 | | UINT16 cnf; |
74 | | UINT16 tc; |
75 | | UINT16 sxm; |
76 | | UINT16 c; |
77 | | UINT16 hm; |
78 | | UINT16 xf; |
79 | | UINT16 pm; |
80 | | }; |
81 | 52 | |
82 | | struct tms32051_state |
83 | | { |
84 | | UINT16 pc; |
85 | | UINT16 op; |
86 | | INT32 acc; |
87 | | INT32 accb; |
88 | | INT32 preg; |
89 | | UINT16 treg0; |
90 | | UINT16 treg1; |
91 | | UINT16 treg2; |
92 | | UINT16 ar[8]; |
93 | | INT32 rptc; |
| 53 | /************************************************************************** |
| 54 | * Internal memory map |
| 55 | **************************************************************************/ |
94 | 56 | |
95 | | UINT16 bmar; |
96 | | INT32 brcr; |
97 | | UINT16 paer; |
98 | | UINT16 pasr; |
99 | | UINT16 indx; |
100 | | UINT16 dbmr; |
101 | | UINT16 arcr; |
| 57 | static ADDRESS_MAP_START( internal_pgm, AS_PROGRAM, 16, tms32051_device ) |
| 58 | AM_RANGE(0x0000, 0x1fff) AM_ROM // ROM TODO: is off-chip if MP/_MC = 0 |
| 59 | AM_RANGE(0x2000, 0x23ff) AM_RAM AM_SHARE("saram") // SARAM TODO: is off-chip if RAM bit = 0 |
| 60 | AM_RANGE(0xfe00, 0xffff) AM_RAM AM_SHARE("daram_b0") // DARAM B0 TODO: is off-chip if CNF = 0 |
| 61 | ADDRESS_MAP_END |
102 | 62 | |
103 | | ST0 st0; |
104 | | ST1 st1; |
105 | | PMST pmst; |
| 63 | static ADDRESS_MAP_START( internal_data, AS_DATA, 16, tms32051_device ) |
| 64 | AM_RANGE(0x0000, 0x005f) AM_READWRITE(cpuregs_r, cpuregs_w) |
| 65 | AM_RANGE(0x0060, 0x007f) AM_RAM // DARAM B2 |
| 66 | AM_RANGE(0x0100, 0x02ff) AM_RAM AM_SHARE("daram_b0") // DARAM B0 TODO: is unconnected if CNF = 1 |
| 67 | AM_RANGE(0x0300, 0x04ff) AM_RAM // DARAM B1 |
| 68 | AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("saram") // SARAM TODO: is off-chip if OVLY = 0 |
| 69 | ADDRESS_MAP_END |
106 | 70 | |
107 | | UINT16 ifr; |
108 | | UINT16 imr; |
109 | 71 | |
110 | | UINT16 pcstack[8]; |
111 | | int pcstack_ptr; |
| 72 | tms32051_device::tms32051_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 73 | : cpu_device(mconfig, TMS32051, "TMS32051", tag, owner, clock, "tms32051", __FILE__) |
| 74 | , m_program_config("program", ENDIANNESS_LITTLE, 16, 16, -1, ADDRESS_MAP_NAME(internal_pgm)) |
| 75 | , m_data_config("data", ENDIANNESS_LITTLE, 16, 16, -1, ADDRESS_MAP_NAME(internal_data)) |
| 76 | { |
| 77 | } |
112 | 78 | |
113 | | UINT16 rpt_start, rpt_end; |
114 | 79 | |
115 | | UINT16 cbcr; |
116 | | UINT16 cbsr1; |
117 | | UINT16 cber1; |
118 | | UINT16 cbsr2; |
119 | | UINT16 cber2; |
120 | | |
121 | | struct |
122 | | { |
123 | | int tddr; |
124 | | int psc; |
125 | | UINT16 tim; |
126 | | UINT16 prd; |
127 | | } timer; |
128 | | |
129 | | struct |
130 | | { |
131 | | INT32 acc; |
132 | | INT32 accb; |
133 | | UINT16 arcr; |
134 | | UINT16 indx; |
135 | | PMST pmst; |
136 | | INT32 preg; |
137 | | ST0 st0; |
138 | | ST1 st1; |
139 | | INT32 treg0; |
140 | | INT32 treg1; |
141 | | INT32 treg2; |
142 | | } shadow; |
143 | | |
144 | | legacy_cpu_device *device; |
145 | | address_space *program; |
146 | | direct_read_data *direct; |
147 | | address_space *data; |
148 | | int icount; |
149 | | }; |
150 | | |
151 | | INLINE tms32051_state *get_safe_token(device_t *device) |
| 80 | offs_t tms32051_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) |
152 | 81 | { |
153 | | assert(device != NULL); |
154 | | assert(device->type() == TMS32051); |
155 | | return (tms32051_state *)downcast<legacy_cpu_device *>(device)->token(); |
| 82 | extern CPU_DISASSEMBLE( tms32051 ); |
| 83 | return CPU_DISASSEMBLE_NAME(tms32051)(this, buffer, pc, oprom, opram, options); |
156 | 84 | } |
157 | 85 | |
158 | | static void delay_slot(tms32051_state *cpustate, UINT16 startpc); |
159 | | static void save_interrupt_context(tms32051_state *cpustate); |
160 | | static void restore_interrupt_context(tms32051_state *cpustate); |
161 | | static void check_interrupts(tms32051_state *cpustate); |
162 | 86 | |
| 87 | #define CYCLES(x) (m_icount -= x) |
163 | 88 | |
164 | | #define CYCLES(x) (cpustate->icount -= x) |
| 89 | #define ROPCODE() m_direct->read_decrypted_word((m_pc++) << 1) |
165 | 90 | |
166 | | #define ROPCODE(cpustate) cpustate->direct->read_decrypted_word((cpustate->pc++) << 1) |
167 | | |
168 | | INLINE void CHANGE_PC(tms32051_state *cpustate, UINT16 new_pc) |
| 91 | void tms32051_device::CHANGE_PC(UINT16 new_pc) |
169 | 92 | { |
170 | | cpustate->pc = new_pc; |
| 93 | m_pc = new_pc; |
171 | 94 | } |
172 | 95 | |
173 | | INLINE UINT16 PM_READ16(tms32051_state *cpustate, UINT16 address) |
| 96 | UINT16 tms32051_device::PM_READ16(UINT16 address) |
174 | 97 | { |
175 | | return cpustate->program->read_word(address << 1); |
| 98 | return m_program->read_word(address << 1); |
176 | 99 | } |
177 | 100 | |
178 | | INLINE void PM_WRITE16(tms32051_state *cpustate, UINT16 address, UINT16 data) |
| 101 | void tms32051_device::PM_WRITE16(UINT16 address, UINT16 data) |
179 | 102 | { |
180 | | cpustate->program->write_word(address << 1, data); |
| 103 | m_program->write_word(address << 1, data); |
181 | 104 | } |
182 | 105 | |
183 | | INLINE UINT16 DM_READ16(tms32051_state *cpustate, UINT16 address) |
| 106 | UINT16 tms32051_device::DM_READ16(UINT16 address) |
184 | 107 | { |
185 | | return cpustate->data->read_word(address << 1); |
| 108 | return m_data->read_word(address << 1); |
186 | 109 | } |
187 | 110 | |
188 | | INLINE void DM_WRITE16(tms32051_state *cpustate, UINT16 address, UINT16 data) |
| 111 | void tms32051_device::DM_WRITE16(UINT16 address, UINT16 data) |
189 | 112 | { |
190 | | cpustate->data->write_word(address << 1, data); |
| 113 | m_data->write_word(address << 1, data); |
191 | 114 | } |
192 | 115 | |
193 | 116 | #include "32051ops.c" |
194 | 117 | #include "32051ops.h" |
195 | 118 | |
196 | | static void op_group_be(tms32051_state *cpustate) |
| 119 | void tms32051_device::op_group_be() |
197 | 120 | { |
198 | | tms32051_opcode_table_be[cpustate->op & 0xff](cpustate); |
| 121 | (this->*s_opcode_table_be[m_op & 0xff])(); |
199 | 122 | } |
200 | 123 | |
201 | | static void op_group_bf(tms32051_state *cpustate) |
| 124 | void tms32051_device::op_group_bf() |
202 | 125 | { |
203 | | tms32051_opcode_table_bf[cpustate->op & 0xff](cpustate); |
| 126 | (this->*s_opcode_table_bf[m_op & 0xff])(); |
204 | 127 | } |
205 | 128 | |
206 | | static void delay_slot(tms32051_state *cpustate, UINT16 startpc) |
| 129 | void tms32051_device::delay_slot(UINT16 startpc) |
207 | 130 | { |
208 | | cpustate->op = ROPCODE(cpustate); |
209 | | tms32051_opcode_table[cpustate->op >> 8](cpustate); |
| 131 | m_op = ROPCODE(); |
| 132 | (this->*s_opcode_table[m_op >> 8])(); |
210 | 133 | |
211 | | while (cpustate->pc - startpc < 2) |
| 134 | while (m_pc - startpc < 2) |
212 | 135 | { |
213 | | cpustate->op = ROPCODE(cpustate); |
214 | | tms32051_opcode_table[cpustate->op >> 8](cpustate); |
| 136 | m_op = ROPCODE(); |
| 137 | (this->*s_opcode_table[m_op >> 8])(); |
215 | 138 | } |
216 | 139 | } |
217 | 140 | |
218 | 141 | /*****************************************************************************/ |
219 | 142 | |
220 | | static CPU_INIT( tms ) |
| 143 | void tms32051_device::device_start() |
221 | 144 | { |
222 | | tms32051_state *cpustate = get_safe_token(device); |
| 145 | m_program = &space(AS_PROGRAM); |
| 146 | m_direct = &m_program->direct(); |
| 147 | m_data = &space(AS_DATA); |
223 | 148 | |
224 | | cpustate->device = device; |
225 | | cpustate->program = &device->space(AS_PROGRAM); |
226 | | cpustate->direct = &cpustate->program->direct(); |
227 | | cpustate->data = &device->space(AS_DATA); |
| 149 | m_pcstack_ptr = 0; |
| 150 | m_op = 0; |
| 151 | m_acc = 0; |
| 152 | m_accb = 0; |
| 153 | m_preg = 0; |
| 154 | m_treg0 = 0; |
| 155 | m_treg1 = 0; |
| 156 | m_treg2 = 0; |
| 157 | memset(m_ar, 0, sizeof(m_ar)); |
| 158 | m_bmar = 0; |
| 159 | m_brcr = 0; |
| 160 | m_paer = 0; |
| 161 | m_pasr = 0; |
| 162 | m_indx = 0; |
| 163 | m_dbmr = 0; |
| 164 | m_arcr = 0; |
| 165 | memset(&m_st0, 0, sizeof(m_st0)); |
| 166 | memset(&m_st1, 0, sizeof(m_st1)); |
| 167 | memset(&m_pmst, 0, sizeof(m_pmst)); |
| 168 | memset(m_pcstack, 0, sizeof(m_pcstack)); |
| 169 | m_imr = 0; |
| 170 | m_cbsr1 = 0; |
| 171 | m_cber1 = 0; |
| 172 | m_cbsr2 = 0; |
| 173 | m_cber2 = 0; |
| 174 | memset(&m_timer, 0, sizeof(m_timer)); |
228 | 175 | |
229 | | cpustate->pcstack_ptr = 0; |
| 176 | state_add( TMS32051_PC, "PC", m_pc).formatstr("%04X"); |
| 177 | state_add( TMS32051_ACC, "ACC", m_acc).formatstr("%08X"); |
| 178 | state_add( TMS32051_ACCB, "ACCB", m_accb).formatstr("%08X"); |
| 179 | state_add( TMS32051_PREG, "PREG", m_preg).formatstr("%08X"); |
| 180 | state_add( TMS32051_TREG0, "TREG0", m_treg0).formatstr("%04X"); |
| 181 | state_add( TMS32051_TREG1, "TREG1", m_treg1).formatstr("%04X"); |
| 182 | state_add( TMS32051_TREG2, "TREG2", m_treg2).formatstr("%04X"); |
| 183 | state_add( TMS32051_BMAR, "BMAR", m_bmar).formatstr("%08X"); |
| 184 | state_add( TMS32051_RPTC, "RPTC", m_rptc).formatstr("%08X"); |
| 185 | state_add( TMS32051_BRCR, "BRCR", m_brcr).formatstr("%08X"); |
| 186 | state_add( TMS32051_INDX, "INDX", m_indx).formatstr("%04X"); |
| 187 | state_add( TMS32051_DBMR, "DBMR", m_dbmr).formatstr("%04X"); |
| 188 | state_add( TMS32051_ARCR, "ARCR", m_arcr).formatstr("%04X"); |
| 189 | state_add( TMS32051_DP, "DP", m_st0.dp).formatstr("%04X"); |
| 190 | state_add( TMS32051_ARP, "ARP", m_st0.arp).formatstr("%04X"); |
| 191 | state_add( TMS32051_ARB, "ARB", m_st1.arb).formatstr("%04X"); |
| 192 | state_add( TMS32051_AR0, "AR0", m_ar[0]).formatstr("%04X"); |
| 193 | state_add( TMS32051_AR1, "AR1", m_ar[1]).formatstr("%04X"); |
| 194 | state_add( TMS32051_AR2, "AR2", m_ar[2]).formatstr("%04X"); |
| 195 | state_add( TMS32051_AR3, "AR3", m_ar[3]).formatstr("%04X"); |
| 196 | state_add( TMS32051_AR4, "AR4", m_ar[4]).formatstr("%04X"); |
| 197 | state_add( TMS32051_AR5, "AR5", m_ar[5]).formatstr("%04X"); |
| 198 | state_add( TMS32051_AR6, "AR6", m_ar[6]).formatstr("%04X"); |
| 199 | state_add( TMS32051_AR7, "AR7", m_ar[7]).formatstr("%04X"); |
| 200 | |
| 201 | state_add(STATE_GENPC, "GENPC", m_pc).formatstr("%04X").noshow(); |
| 202 | |
| 203 | m_icountptr = &m_icount; |
230 | 204 | } |
231 | 205 | |
232 | | static CPU_RESET( tms ) |
| 206 | void tms32051_device::device_reset() |
233 | 207 | { |
234 | | tms32051_state *cpustate = get_safe_token(device); |
235 | | |
236 | 208 | // reset registers |
237 | | cpustate->st0.intm = 1; |
238 | | cpustate->st0.ov = 0; |
239 | | cpustate->st1.c = 1; |
240 | | cpustate->st1.cnf = 0; |
241 | | cpustate->st1.hm = 1; |
242 | | cpustate->st1.pm = 0; |
243 | | cpustate->st1.sxm = 1; |
244 | | cpustate->st1.xf = 1; |
245 | | cpustate->pmst.avis = 0; |
246 | | cpustate->pmst.braf = 0; |
247 | | cpustate->pmst.iptr = 0; |
248 | | cpustate->pmst.ndx = 0; |
249 | | cpustate->pmst.ovly = 0; |
250 | | cpustate->pmst.ram = 0; |
251 | | cpustate->pmst.mpmc = 0; // TODO: this is set to logical pin state at reset |
252 | | cpustate->pmst.trm = 0; |
253 | | cpustate->ifr = 0; |
254 | | cpustate->cbcr = 0; |
255 | | cpustate->rptc = -1; |
| 209 | m_st0.intm = 1; |
| 210 | m_st0.ov = 0; |
| 211 | m_st1.c = 1; |
| 212 | m_st1.cnf = 0; |
| 213 | m_st1.hm = 1; |
| 214 | m_st1.pm = 0; |
| 215 | m_st1.sxm = 1; |
| 216 | m_st1.xf = 1; |
| 217 | m_pmst.avis = 0; |
| 218 | m_pmst.braf = 0; |
| 219 | m_pmst.iptr = 0; |
| 220 | m_pmst.ndx = 0; |
| 221 | m_pmst.ovly = 0; |
| 222 | m_pmst.ram = 0; |
| 223 | m_pmst.mpmc = 0; // TODO: this is set to logical pin state at reset |
| 224 | m_pmst.trm = 0; |
| 225 | m_ifr = 0; |
| 226 | m_cbcr = 0; |
| 227 | m_rptc = -1; |
256 | 228 | |
257 | 229 | // simulate internal rom boot loader (can be removed when the dsp rom(s) is dumped) |
258 | | cpustate->st0.intm = 1; |
259 | | cpustate->st1.cnf = 1; |
260 | | cpustate->pmst.ram = 1; |
261 | | cpustate->pmst.ovly = 0; |
| 230 | m_st0.intm = 1; |
| 231 | m_st1.cnf = 1; |
| 232 | m_pmst.ram = 1; |
| 233 | m_pmst.ovly = 0; |
262 | 234 | |
263 | 235 | int i; |
264 | 236 | UINT16 src, dst, length; |
265 | 237 | |
266 | 238 | src = 0x7800; |
267 | | dst = DM_READ16(cpustate, src++); |
268 | | length = DM_READ16(cpustate, src++); |
| 239 | dst = DM_READ16(src++); |
| 240 | length = DM_READ16(src++); |
269 | 241 | |
270 | | CHANGE_PC(cpustate, dst); |
| 242 | CHANGE_PC(dst); |
271 | 243 | |
272 | 244 | /* TODO: if you soft reset on Taito JC it tries to do a 0x7802->0x9007 (0xff00) transfer. */ |
273 | 245 | for (i=0; i < (length & 0x7ff); i++) |
274 | 246 | { |
275 | | UINT16 data = DM_READ16(cpustate, src++); |
276 | | PM_WRITE16(cpustate, dst++, data); |
| 247 | UINT16 data = DM_READ16(src++); |
| 248 | PM_WRITE16(dst++, data); |
277 | 249 | } |
278 | 250 | } |
279 | 251 | |
280 | | static void check_interrupts(tms32051_state *cpustate) |
| 252 | void tms32051_device::check_interrupts() |
281 | 253 | { |
282 | 254 | int i; |
283 | 255 | |
284 | | if (cpustate->st0.intm == 0 && cpustate->ifr != 0) |
| 256 | if (m_st0.intm == 0 && m_ifr != 0) |
285 | 257 | { |
286 | 258 | for (i=0; i < 16; i++) |
287 | 259 | { |
288 | | if (cpustate->ifr & (1 << i)) |
| 260 | if (m_ifr & (1 << i)) |
289 | 261 | { |
290 | | cpustate->st0.intm = 1; |
291 | | PUSH_STACK(cpustate, cpustate->pc); |
| 262 | m_st0.intm = 1; |
| 263 | PUSH_STACK(m_pc); |
292 | 264 | |
293 | | cpustate->pc = (cpustate->pmst.iptr << 11) | ((i+1) << 1); |
294 | | cpustate->ifr &= ~(1 << i); |
| 265 | m_pc = (m_pmst.iptr << 11) | ((i+1) << 1); |
| 266 | m_ifr &= ~(1 << i); |
295 | 267 | |
296 | | save_interrupt_context(cpustate); |
| 268 | save_interrupt_context(); |
297 | 269 | break; |
298 | 270 | } |
299 | 271 | } |
300 | 272 | } |
301 | 273 | } |
302 | 274 | |
303 | | static void save_interrupt_context(tms32051_state *cpustate) |
| 275 | void tms32051_device::save_interrupt_context() |
304 | 276 | { |
305 | | cpustate->shadow.acc = cpustate->acc; |
306 | | cpustate->shadow.accb = cpustate->accb; |
307 | | cpustate->shadow.arcr = cpustate->arcr; |
308 | | cpustate->shadow.indx = cpustate->indx; |
309 | | cpustate->shadow.preg = cpustate->preg; |
310 | | cpustate->shadow.treg0 = cpustate->treg0; |
311 | | cpustate->shadow.treg1 = cpustate->treg1; |
312 | | cpustate->shadow.treg2 = cpustate->treg2; |
313 | | memcpy(&cpustate->shadow.pmst, &cpustate->pmst, sizeof(PMST)); |
314 | | memcpy(&cpustate->shadow.st0, &cpustate->st0, sizeof(ST0)); |
315 | | memcpy(&cpustate->shadow.st1, &cpustate->st1, sizeof(ST1)); |
| 277 | m_shadow.acc = m_acc; |
| 278 | m_shadow.accb = m_accb; |
| 279 | m_shadow.arcr = m_arcr; |
| 280 | m_shadow.indx = m_indx; |
| 281 | m_shadow.preg = m_preg; |
| 282 | m_shadow.treg0 = m_treg0; |
| 283 | m_shadow.treg1 = m_treg1; |
| 284 | m_shadow.treg2 = m_treg2; |
| 285 | memcpy(&m_shadow.pmst, &m_pmst, sizeof(TMS32051_PMST)); |
| 286 | memcpy(&m_shadow.st0, &m_st0, sizeof(TMS32051_ST0)); |
| 287 | memcpy(&m_shadow.st1, &m_st1, sizeof(TMS32051_ST1)); |
316 | 288 | } |
317 | 289 | |
318 | | static void restore_interrupt_context(tms32051_state *cpustate) |
| 290 | void tms32051_device::restore_interrupt_context() |
319 | 291 | { |
320 | | cpustate->acc = cpustate->shadow.acc; |
321 | | cpustate->accb = cpustate->shadow.accb; |
322 | | cpustate->arcr = cpustate->shadow.arcr; |
323 | | cpustate->indx = cpustate->shadow.indx; |
324 | | cpustate->preg = cpustate->shadow.preg; |
325 | | cpustate->treg0 = cpustate->shadow.treg0; |
326 | | cpustate->treg1 = cpustate->shadow.treg1; |
327 | | cpustate->treg2 = cpustate->shadow.treg2; |
328 | | memcpy(&cpustate->pmst, &cpustate->shadow.pmst, sizeof(PMST)); |
329 | | memcpy(&cpustate->st0, &cpustate->shadow.st0, sizeof(ST0)); |
330 | | memcpy(&cpustate->st1, &cpustate->shadow.st1, sizeof(ST1)); |
| 292 | m_acc = m_shadow.acc; |
| 293 | m_accb = m_shadow.accb; |
| 294 | m_arcr = m_shadow.arcr; |
| 295 | m_indx = m_shadow.indx; |
| 296 | m_preg = m_shadow.preg; |
| 297 | m_treg0 = m_shadow.treg0; |
| 298 | m_treg1 = m_shadow.treg1; |
| 299 | m_treg2 = m_shadow.treg2; |
| 300 | memcpy(&m_pmst, &m_shadow.pmst, sizeof(TMS32051_PMST)); |
| 301 | memcpy(&m_st0, &m_shadow.st0, sizeof(TMS32051_ST0)); |
| 302 | memcpy(&m_st1, &m_shadow.st1, sizeof(TMS32051_ST1)); |
331 | 303 | } |
332 | 304 | |
333 | | static void tms_interrupt(tms32051_state *cpustate, int irq) |
| 305 | void tms32051_device::execute_set_input(int irq, int state) |
334 | 306 | { |
335 | | if ((cpustate->imr & (1 << irq)) != 0) |
| 307 | if ( state == ASSERT_LINE ) |
336 | 308 | { |
337 | | cpustate->ifr |= 1 << irq; |
338 | | } |
| 309 | if ((m_imr & (1 << irq)) != 0) |
| 310 | { |
| 311 | m_ifr |= 1 << irq; |
| 312 | } |
339 | 313 | |
340 | | check_interrupts(cpustate); |
| 314 | check_interrupts(); |
| 315 | } |
341 | 316 | } |
342 | 317 | |
343 | | static CPU_EXIT( tms ) |
344 | | { |
345 | | /* TODO */ |
346 | | } |
347 | 318 | |
348 | | static CPU_EXECUTE( tms ) |
| 319 | void tms32051_device::execute_run() |
349 | 320 | { |
350 | | tms32051_state *cpustate = get_safe_token(device); |
351 | | |
352 | | while(cpustate->icount > 0) |
| 321 | while(m_icount > 0) |
353 | 322 | { |
354 | 323 | UINT16 ppc; |
355 | 324 | |
356 | 325 | // handle block repeat |
357 | | if (cpustate->pmst.braf) |
| 326 | if (m_pmst.braf) |
358 | 327 | { |
359 | | if (cpustate->pc == cpustate->paer) |
| 328 | if (m_pc == m_paer) |
360 | 329 | { |
361 | | if (cpustate->brcr > 0) |
| 330 | if (m_brcr > 0) |
362 | 331 | { |
363 | | CHANGE_PC(cpustate, cpustate->pasr); |
| 332 | CHANGE_PC(m_pasr); |
364 | 333 | } |
365 | 334 | |
366 | | cpustate->brcr--; |
367 | | if (cpustate->brcr <= 0) |
| 335 | m_brcr--; |
| 336 | if (m_brcr <= 0) |
368 | 337 | { |
369 | | cpustate->pmst.braf = 0; |
| 338 | m_pmst.braf = 0; |
370 | 339 | } |
371 | 340 | } |
372 | 341 | } |
373 | 342 | |
374 | | ppc = cpustate->pc; |
375 | | debugger_instruction_hook(device, cpustate->pc); |
| 343 | ppc = m_pc; |
| 344 | debugger_instruction_hook(this, m_pc); |
376 | 345 | |
377 | | cpustate->op = ROPCODE(cpustate); |
378 | | tms32051_opcode_table[cpustate->op >> 8](cpustate); |
| 346 | m_op = ROPCODE(); |
| 347 | (this->*s_opcode_table[m_op >> 8])(); |
379 | 348 | |
380 | 349 | // handle single repeat |
381 | | if (cpustate->rptc > 0) |
| 350 | if (m_rptc > 0) |
382 | 351 | { |
383 | | if (ppc == cpustate->rpt_end) |
| 352 | if (ppc == m_rpt_end) |
384 | 353 | { |
385 | | CHANGE_PC(cpustate, cpustate->rpt_start); |
386 | | cpustate->rptc--; |
| 354 | CHANGE_PC(m_rpt_start); |
| 355 | m_rptc--; |
387 | 356 | } |
388 | 357 | } |
389 | 358 | else |
390 | 359 | { |
391 | | cpustate->rptc = 0; |
| 360 | m_rptc = 0; |
392 | 361 | } |
393 | 362 | |
394 | | cpustate->timer.psc--; |
395 | | if (cpustate->timer.psc <= 0) |
| 363 | m_timer.psc--; |
| 364 | if (m_timer.psc <= 0) |
396 | 365 | { |
397 | | cpustate->timer.psc = cpustate->timer.tddr; |
398 | | cpustate->timer.tim--; |
399 | | if (cpustate->timer.tim <= 0) |
| 366 | m_timer.psc = m_timer.tddr; |
| 367 | m_timer.tim--; |
| 368 | if (m_timer.tim <= 0) |
400 | 369 | { |
401 | 370 | // reset timer |
402 | | cpustate->timer.tim = cpustate->timer.prd; |
| 371 | m_timer.tim = m_timer.prd; |
403 | 372 | |
404 | | tms_interrupt(cpustate, INTERRUPT_TINT); |
| 373 | execute_set_input(INTERRUPT_TINT, ASSERT_LINE); |
405 | 374 | } |
406 | 375 | } |
407 | 376 | } |
r26840 | r26841 | |
410 | 379 | |
411 | 380 | /*****************************************************************************/ |
412 | 381 | |
413 | | static READ16_HANDLER( cpuregs_r ) |
| 382 | READ16_MEMBER( tms32051_device::cpuregs_r ) |
414 | 383 | { |
415 | | tms32051_state *cpustate = get_safe_token(&space.device()); |
416 | | |
417 | 384 | switch (offset) |
418 | 385 | { |
419 | | case 0x04: return cpustate->imr; |
420 | | case 0x06: return cpustate->ifr; |
| 386 | case 0x04: return m_imr; |
| 387 | case 0x06: return m_ifr; |
421 | 388 | |
422 | 389 | case 0x07: // PMST |
423 | 390 | { |
424 | 391 | UINT16 r = 0; |
425 | | r |= cpustate->pmst.iptr << 11; |
426 | | r |= cpustate->pmst.avis << 7; |
427 | | r |= cpustate->pmst.ovly << 5; |
428 | | r |= cpustate->pmst.ram << 4; |
429 | | r |= cpustate->pmst.mpmc << 3; |
430 | | r |= cpustate->pmst.ndx << 2; |
431 | | r |= cpustate->pmst.trm << 1; |
432 | | r |= cpustate->pmst.braf << 0; |
| 392 | r |= m_pmst.iptr << 11; |
| 393 | r |= m_pmst.avis << 7; |
| 394 | r |= m_pmst.ovly << 5; |
| 395 | r |= m_pmst.ram << 4; |
| 396 | r |= m_pmst.mpmc << 3; |
| 397 | r |= m_pmst.ndx << 2; |
| 398 | r |= m_pmst.trm << 1; |
| 399 | r |= m_pmst.braf << 0; |
433 | 400 | return r; |
434 | 401 | } |
435 | 402 | |
436 | | case 0x09: return cpustate->brcr; |
437 | | case 0x10: return cpustate->ar[0]; |
438 | | case 0x11: return cpustate->ar[1]; |
439 | | case 0x12: return cpustate->ar[2]; |
440 | | case 0x13: return cpustate->ar[3]; |
441 | | case 0x14: return cpustate->ar[4]; |
442 | | case 0x15: return cpustate->ar[5]; |
443 | | case 0x16: return cpustate->ar[6]; |
444 | | case 0x17: return cpustate->ar[7]; |
445 | | case 0x1e: return cpustate->cbcr; |
446 | | case 0x1f: return cpustate->bmar; |
447 | | case 0x24: return cpustate->timer.tim; |
448 | | case 0x25: return cpustate->timer.prd; |
| 403 | case 0x09: return m_brcr; |
| 404 | case 0x10: return m_ar[0]; |
| 405 | case 0x11: return m_ar[1]; |
| 406 | case 0x12: return m_ar[2]; |
| 407 | case 0x13: return m_ar[3]; |
| 408 | case 0x14: return m_ar[4]; |
| 409 | case 0x15: return m_ar[5]; |
| 410 | case 0x16: return m_ar[6]; |
| 411 | case 0x17: return m_ar[7]; |
| 412 | case 0x1e: return m_cbcr; |
| 413 | case 0x1f: return m_bmar; |
| 414 | case 0x24: return m_timer.tim; |
| 415 | case 0x25: return m_timer.prd; |
449 | 416 | |
450 | 417 | case 0x26: // TCR |
451 | 418 | { |
452 | 419 | UINT16 r = 0; |
453 | | r |= (cpustate->timer.psc & 0xf) << 6; |
454 | | r |= (cpustate->timer.tddr & 0xf); |
| 420 | r |= (m_timer.psc & 0xf) << 6; |
| 421 | r |= (m_timer.tddr & 0xf); |
455 | 422 | return r; |
456 | 423 | } |
457 | 424 | |
458 | 425 | case 0x28: return 0; // PDWSR |
459 | 426 | default: |
460 | 427 | if(!space.debugger_access()) |
461 | | fatalerror("32051: cpuregs_r: unimplemented memory-mapped register %02X at %04X\n", offset, cpustate->pc-1); |
| 428 | fatalerror("32051: cpuregs_r: unimplemented memory-mapped register %02X at %04X\n", offset, m_pc-1); |
462 | 429 | } |
463 | 430 | |
464 | 431 | return 0; |
465 | 432 | } |
466 | 433 | |
467 | | static WRITE16_HANDLER( cpuregs_w ) |
| 434 | WRITE16_MEMBER( tms32051_device::cpuregs_w ) |
468 | 435 | { |
469 | | tms32051_state *cpustate = get_safe_token(&space.device()); |
470 | | |
471 | 436 | switch (offset) |
472 | 437 | { |
473 | 438 | case 0x00: break; |
474 | | case 0x04: cpustate->imr = data; break; |
| 439 | case 0x04: m_imr = data; break; |
475 | 440 | case 0x06: // IFR |
476 | 441 | { |
477 | 442 | int i; |
r26840 | r26841 | |
479 | 444 | { |
480 | 445 | if (data & (1 << i)) |
481 | 446 | { |
482 | | cpustate->ifr &= ~(1 << i); |
| 447 | m_ifr &= ~(1 << i); |
483 | 448 | } |
484 | 449 | } |
485 | 450 | break; |
r26840 | r26841 | |
487 | 452 | |
488 | 453 | case 0x07: // PMST |
489 | 454 | { |
490 | | cpustate->pmst.iptr = (data >> 11) & 0x1f; |
491 | | cpustate->pmst.avis = (data & 0x80) ? 1 : 0; |
492 | | cpustate->pmst.ovly = (data & 0x20) ? 1 : 0; |
493 | | cpustate->pmst.ram = (data & 0x10) ? 1 : 0; |
494 | | cpustate->pmst.mpmc = (data & 0x08) ? 1 : 0; |
495 | | cpustate->pmst.ndx = (data & 0x04) ? 1 : 0; |
496 | | cpustate->pmst.trm = (data & 0x02) ? 1 : 0; |
497 | | cpustate->pmst.braf = (data & 0x01) ? 1 : 0; |
| 455 | m_pmst.iptr = (data >> 11) & 0x1f; |
| 456 | m_pmst.avis = (data & 0x80) ? 1 : 0; |
| 457 | m_pmst.ovly = (data & 0x20) ? 1 : 0; |
| 458 | m_pmst.ram = (data & 0x10) ? 1 : 0; |
| 459 | m_pmst.mpmc = (data & 0x08) ? 1 : 0; |
| 460 | m_pmst.ndx = (data & 0x04) ? 1 : 0; |
| 461 | m_pmst.trm = (data & 0x02) ? 1 : 0; |
| 462 | m_pmst.braf = (data & 0x01) ? 1 : 0; |
498 | 463 | break; |
499 | 464 | } |
500 | 465 | |
501 | | case 0x09: cpustate->brcr = data; break; |
502 | | case 0x0e: cpustate->treg2 = data; break; |
503 | | case 0x0f: cpustate->dbmr = data; break; |
504 | | case 0x10: cpustate->ar[0] = data; break; |
505 | | case 0x11: cpustate->ar[1] = data; break; |
506 | | case 0x12: cpustate->ar[2] = data; break; |
507 | | case 0x13: cpustate->ar[3] = data; break; |
508 | | case 0x14: cpustate->ar[4] = data; break; |
509 | | case 0x15: cpustate->ar[5] = data; break; |
510 | | case 0x16: cpustate->ar[6] = data; break; |
511 | | case 0x17: cpustate->ar[7] = data; break; |
512 | | case 0x18: cpustate->indx = data; break; |
513 | | case 0x19: cpustate->arcr = data; break; |
514 | | case 0x1a: cpustate->cbsr1 = data; break; |
515 | | case 0x1b: cpustate->cber1 = data; break; |
516 | | case 0x1c: cpustate->cbsr2 = data; break; |
517 | | case 0x1d: cpustate->cber2 = data; break; |
518 | | case 0x1e: cpustate->cbcr = data; break; |
519 | | case 0x1f: cpustate->bmar = data; break; |
520 | | case 0x24: cpustate->timer.tim = data; break; |
521 | | case 0x25: cpustate->timer.prd = data; break; |
| 466 | case 0x09: m_brcr = data; break; |
| 467 | case 0x0e: m_treg2 = data; break; |
| 468 | case 0x0f: m_dbmr = data; break; |
| 469 | case 0x10: m_ar[0] = data; break; |
| 470 | case 0x11: m_ar[1] = data; break; |
| 471 | case 0x12: m_ar[2] = data; break; |
| 472 | case 0x13: m_ar[3] = data; break; |
| 473 | case 0x14: m_ar[4] = data; break; |
| 474 | case 0x15: m_ar[5] = data; break; |
| 475 | case 0x16: m_ar[6] = data; break; |
| 476 | case 0x17: m_ar[7] = data; break; |
| 477 | case 0x18: m_indx = data; break; |
| 478 | case 0x19: m_arcr = data; break; |
| 479 | case 0x1a: m_cbsr1 = data; break; |
| 480 | case 0x1b: m_cber1 = data; break; |
| 481 | case 0x1c: m_cbsr2 = data; break; |
| 482 | case 0x1d: m_cber2 = data; break; |
| 483 | case 0x1e: m_cbcr = data; break; |
| 484 | case 0x1f: m_bmar = data; break; |
| 485 | case 0x24: m_timer.tim = data; break; |
| 486 | case 0x25: m_timer.prd = data; break; |
522 | 487 | |
523 | 488 | case 0x26: // TCR |
524 | 489 | { |
525 | | cpustate->timer.tddr = data & 0xf; |
526 | | cpustate->timer.psc = (data >> 6) & 0xf; |
| 490 | m_timer.tddr = data & 0xf; |
| 491 | m_timer.psc = (data >> 6) & 0xf; |
527 | 492 | |
528 | 493 | if (data & 0x20) |
529 | 494 | { |
530 | | cpustate->timer.tim = cpustate->timer.prd; |
531 | | cpustate->timer.psc = cpustate->timer.tddr; |
| 495 | m_timer.tim = m_timer.prd; |
| 496 | m_timer.psc = m_timer.tddr; |
532 | 497 | } |
533 | 498 | break; |
534 | 499 | } |
r26840 | r26841 | |
536 | 501 | case 0x28: break; // PDWSR |
537 | 502 | default: |
538 | 503 | if(!space.debugger_access()) |
539 | | fatalerror("32051: cpuregs_w: unimplemented memory-mapped register %02X, data %04X at %04X\n", offset, data, cpustate->pc-1); |
| 504 | fatalerror("32051: cpuregs_w: unimplemented memory-mapped register %02X, data %04X at %04X\n", offset, data, m_pc-1); |
540 | 505 | } |
541 | 506 | } |
542 | 507 | |
543 | | /************************************************************************** |
544 | | * Internal memory map |
545 | | **************************************************************************/ |
546 | 508 | |
547 | | static ADDRESS_MAP_START( internal_pgm, AS_PROGRAM, 16, legacy_cpu_device ) |
548 | | AM_RANGE(0x0000, 0x1fff) AM_ROM // ROM TODO: is off-chip if MP/_MC = 0 |
549 | | AM_RANGE(0x2000, 0x23ff) AM_RAM AM_SHARE("saram") // SARAM TODO: is off-chip if RAM bit = 0 |
550 | | AM_RANGE(0xfe00, 0xffff) AM_RAM AM_SHARE("daram_b0") // DARAM B0 TODO: is off-chip if CNF = 0 |
551 | | ADDRESS_MAP_END |
| 509 | bool tms32051_device::memory_read(address_spacenum spacenum, offs_t offset, int size, UINT64 &value) |
552 | 510 | |
553 | | static ADDRESS_MAP_START( internal_data, AS_DATA, 16, legacy_cpu_device ) |
554 | | AM_RANGE(0x0000, 0x005f) AM_READWRITE_LEGACY(cpuregs_r, cpuregs_w) |
555 | | AM_RANGE(0x0060, 0x007f) AM_RAM // DARAM B2 |
556 | | AM_RANGE(0x0100, 0x02ff) AM_RAM AM_SHARE("daram_b0") // DARAM B0 TODO: is unconnected if CNF = 1 |
557 | | AM_RANGE(0x0300, 0x04ff) AM_RAM // DARAM B1 |
558 | | AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("saram") // SARAM TODO: is off-chip if OVLY = 0 |
559 | | ADDRESS_MAP_END |
560 | | |
561 | | /************************************************************************** |
562 | | * Generic set_info |
563 | | **************************************************************************/ |
564 | | |
565 | | static CPU_SET_INFO( tms ) |
566 | 511 | { |
567 | | tms32051_state *cpustate = get_safe_token(device); |
568 | | |
569 | | switch (state) |
570 | | { |
571 | | case CPUINFO_INT_PC: |
572 | | case CPUINFO_INT_REGISTER + TMS32051_PC: cpustate->pc = info->i; break; |
573 | | } |
574 | | } |
575 | | |
576 | | static CPU_READ( tms ) |
577 | | { |
578 | | tms32051_state *cpustate = get_safe_token(device); |
579 | 512 | /* TODO: alignment if offset is odd */ |
580 | | if (space == AS_PROGRAM) |
| 513 | if (spacenum == AS_PROGRAM) |
581 | 514 | { |
582 | | *value = (PM_READ16(cpustate, offset>>1)); |
| 515 | value = (PM_READ16(offset>>1)); |
583 | 516 | } |
584 | | else if (space == AS_DATA) |
| 517 | else if (spacenum == AS_DATA) |
585 | 518 | { |
586 | | *value = (DM_READ16(cpustate, offset>>1)); |
| 519 | value = (DM_READ16(offset>>1)); |
587 | 520 | } |
588 | 521 | return 1; |
589 | 522 | } |
590 | 523 | |
591 | | static CPU_GET_INFO( tms ) |
592 | | { |
593 | | tms32051_state *cpustate = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL; |
594 | | |
595 | | switch(state) |
596 | | { |
597 | | /* --- the following bits of info are returned as 64-bit signed integers --- */ |
598 | | case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(tms32051_state); break; |
599 | | case CPUINFO_INT_INPUT_LINES: info->i = 6; break; |
600 | | case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break; |
601 | | case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_LITTLE; break; |
602 | | case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break; |
603 | | case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break; |
604 | | case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 2; break; |
605 | | case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 4; break; |
606 | | case CPUINFO_INT_MIN_CYCLES: info->i = 1; break; |
607 | | case CPUINFO_INT_MAX_CYCLES: info->i = 5; break; |
608 | | |
609 | | case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 16; break; |
610 | | case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 16; break; |
611 | | case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = -1; break; |
612 | | case CPUINFO_INT_DATABUS_WIDTH + AS_DATA: info->i = 16; break; |
613 | | case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA: info->i = 16; break; |
614 | | case CPUINFO_INT_ADDRBUS_SHIFT + AS_DATA: info->i = -1; break; |
615 | | case CPUINFO_INT_DATABUS_WIDTH + AS_IO: info->i = 0; break; |
616 | | case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO: info->i = 0; break; |
617 | | case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO: info->i = 0; break; |
618 | | |
619 | | case CPUINFO_INT_INPUT_STATE: info->i = CLEAR_LINE; break; |
620 | | |
621 | | case CPUINFO_INT_PREVIOUSPC: /* not implemented */ break; |
622 | | |
623 | | case CPUINFO_INT_PC: |
624 | | case CPUINFO_INT_REGISTER + TMS32051_PC: info->i = cpustate->pc; break; |
625 | | case CPUINFO_INT_REGISTER + TMS32051_ACC: info->i = cpustate->acc; break; |
626 | | case CPUINFO_INT_REGISTER + TMS32051_ACCB: info->i = cpustate->accb; break; |
627 | | case CPUINFO_INT_REGISTER + TMS32051_PREG: info->i = cpustate->preg; break; |
628 | | case CPUINFO_INT_REGISTER + TMS32051_TREG0: info->i = cpustate->treg0; break; |
629 | | case CPUINFO_INT_REGISTER + TMS32051_TREG1: info->i = cpustate->treg1; break; |
630 | | case CPUINFO_INT_REGISTER + TMS32051_TREG2: info->i = cpustate->treg2; break; |
631 | | case CPUINFO_INT_REGISTER + TMS32051_BMAR: info->i = cpustate->bmar; break; |
632 | | case CPUINFO_INT_REGISTER + TMS32051_RPTC: info->i = cpustate->rptc; break; |
633 | | case CPUINFO_INT_REGISTER + TMS32051_BRCR: info->i = cpustate->brcr; break; |
634 | | case CPUINFO_INT_REGISTER + TMS32051_INDX: info->i = cpustate->indx; break; |
635 | | case CPUINFO_INT_REGISTER + TMS32051_DBMR: info->i = cpustate->dbmr; break; |
636 | | case CPUINFO_INT_REGISTER + TMS32051_ARCR: info->i = cpustate->arcr; break; |
637 | | case CPUINFO_INT_REGISTER + TMS32051_DP: info->i = cpustate->st0.dp; break; |
638 | | case CPUINFO_INT_REGISTER + TMS32051_ARP: info->i = cpustate->st0.arp; break; |
639 | | case CPUINFO_INT_REGISTER + TMS32051_ARB: info->i = cpustate->st1.arb; break; |
640 | | case CPUINFO_INT_REGISTER + TMS32051_AR0: info->i = cpustate->ar[0]; break; |
641 | | case CPUINFO_INT_REGISTER + TMS32051_AR1: info->i = cpustate->ar[1]; break; |
642 | | case CPUINFO_INT_REGISTER + TMS32051_AR2: info->i = cpustate->ar[2]; break; |
643 | | case CPUINFO_INT_REGISTER + TMS32051_AR3: info->i = cpustate->ar[3]; break; |
644 | | case CPUINFO_INT_REGISTER + TMS32051_AR4: info->i = cpustate->ar[4]; break; |
645 | | case CPUINFO_INT_REGISTER + TMS32051_AR5: info->i = cpustate->ar[5]; break; |
646 | | case CPUINFO_INT_REGISTER + TMS32051_AR6: info->i = cpustate->ar[6]; break; |
647 | | case CPUINFO_INT_REGISTER + TMS32051_AR7: info->i = cpustate->ar[7]; break; |
648 | | |
649 | | /* --- the following bits of info are returned as pointers to data or functions --- */ |
650 | | case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(tms); break; |
651 | | case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(tms); break; |
652 | | case CPUINFO_FCT_EXIT: info->exit = CPU_EXIT_NAME(tms); break; |
653 | | case CPUINFO_FCT_EXECUTE: info->execute = CPU_EXECUTE_NAME(tms); break; |
654 | | case CPUINFO_FCT_BURN: info->burn = NULL; break; |
655 | | case CPUINFO_FCT_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(tms32051); break; |
656 | | case CPUINFO_FCT_READ: info->read = CPU_READ_NAME(tms); break; |
657 | | case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &cpustate->icount; break; |
658 | | case CPUINFO_PTR_INTERNAL_MEMORY_MAP + AS_PROGRAM: info->internal_map16 = ADDRESS_MAP_NAME(internal_pgm); break; |
659 | | case CPUINFO_PTR_INTERNAL_MEMORY_MAP + AS_DATA: info->internal_map16 = ADDRESS_MAP_NAME(internal_data); break; |
660 | | |
661 | | /* --- the following bits of info are returned as NULL-terminated strings --- */ |
662 | | case CPUINFO_STR_FAMILY: strcpy(info->s, "TMS3205x"); break; |
663 | | case CPUINFO_STR_VERSION: strcpy(info->s, "1.0"); break; |
664 | | case CPUINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; |
665 | | case CPUINFO_STR_CREDITS: strcpy(info->s, "Copyright Ville Linde"); break; |
666 | | |
667 | | case CPUINFO_STR_FLAGS: strcpy(info->s, " "); break; |
668 | | |
669 | | case CPUINFO_STR_REGISTER + TMS32051_PC: sprintf(info->s, "PC: %04X", cpustate->pc); break; |
670 | | case CPUINFO_STR_REGISTER + TMS32051_ACC: sprintf(info->s, "ACC: %08X", cpustate->acc); break; |
671 | | case CPUINFO_STR_REGISTER + TMS32051_ACCB: sprintf(info->s, "ACCB: %08X", cpustate->accb); break; |
672 | | case CPUINFO_STR_REGISTER + TMS32051_PREG: sprintf(info->s, "PREG: %08X", cpustate->preg); break; |
673 | | case CPUINFO_STR_REGISTER + TMS32051_TREG0: sprintf(info->s, "TREG0: %04X", cpustate->treg0); break; |
674 | | case CPUINFO_STR_REGISTER + TMS32051_TREG1: sprintf(info->s, "TREG1: %04X", cpustate->treg1); break; |
675 | | case CPUINFO_STR_REGISTER + TMS32051_TREG2: sprintf(info->s, "TREG2: %04X", cpustate->treg2); break; |
676 | | case CPUINFO_STR_REGISTER + TMS32051_BMAR: sprintf(info->s, "BMAR: %08X", cpustate->bmar); break; |
677 | | case CPUINFO_STR_REGISTER + TMS32051_RPTC: sprintf(info->s, "RPTC: %08X", cpustate->rptc); break; |
678 | | case CPUINFO_STR_REGISTER + TMS32051_BRCR: sprintf(info->s, "BRCR: %08X", cpustate->brcr); break; |
679 | | case CPUINFO_STR_REGISTER + TMS32051_INDX: sprintf(info->s, "INDX: %04X", cpustate->indx); break; |
680 | | case CPUINFO_STR_REGISTER + TMS32051_DBMR: sprintf(info->s, "DBMR: %04X", cpustate->dbmr); break; |
681 | | case CPUINFO_STR_REGISTER + TMS32051_ARCR: sprintf(info->s, "ARCR: %04X", cpustate->arcr); break; |
682 | | case CPUINFO_STR_REGISTER + TMS32051_DP: sprintf(info->s, "DP: %04X", cpustate->st0.dp); break; |
683 | | case CPUINFO_STR_REGISTER + TMS32051_ARP: sprintf(info->s, "ARP: %04X", cpustate->st0.arp); break; |
684 | | case CPUINFO_STR_REGISTER + TMS32051_ARB: sprintf(info->s, "ARB: %04X", cpustate->st1.arb); break; |
685 | | case CPUINFO_STR_REGISTER + TMS32051_AR0: sprintf(info->s, "AR0: %04X", cpustate->ar[0]); break; |
686 | | case CPUINFO_STR_REGISTER + TMS32051_AR1: sprintf(info->s, "AR1: %04X", cpustate->ar[1]); break; |
687 | | case CPUINFO_STR_REGISTER + TMS32051_AR2: sprintf(info->s, "AR2: %04X", cpustate->ar[2]); break; |
688 | | case CPUINFO_STR_REGISTER + TMS32051_AR3: sprintf(info->s, "AR3: %04X", cpustate->ar[3]); break; |
689 | | case CPUINFO_STR_REGISTER + TMS32051_AR4: sprintf(info->s, "AR4: %04X", cpustate->ar[4]); break; |
690 | | case CPUINFO_STR_REGISTER + TMS32051_AR5: sprintf(info->s, "AR5: %04X", cpustate->ar[5]); break; |
691 | | case CPUINFO_STR_REGISTER + TMS32051_AR6: sprintf(info->s, "AR6: %04X", cpustate->ar[6]); break; |
692 | | case CPUINFO_STR_REGISTER + TMS32051_AR7: sprintf(info->s, "AR7: %04X", cpustate->ar[7]); break; |
693 | | } |
694 | | } |
695 | | |
696 | | static CPU_SET_INFO( tms32051 ) |
697 | | { |
698 | | tms32051_state *cpustate = get_safe_token(device); |
699 | | |
700 | | if (state >= CPUINFO_INT_INPUT_STATE && state <= CPUINFO_INT_INPUT_STATE + 5) |
701 | | { |
702 | | return; |
703 | | } |
704 | | switch(state) |
705 | | { |
706 | | case CPUINFO_INT_PC: |
707 | | case CPUINFO_INT_REGISTER + TMS32051_PC: cpustate->pc = info->i; break; |
708 | | case CPUINFO_INT_REGISTER + TMS32051_ACC: cpustate->acc = info->i; break; |
709 | | case CPUINFO_INT_REGISTER + TMS32051_ACCB: cpustate->accb = info->i; break; |
710 | | case CPUINFO_INT_REGISTER + TMS32051_PREG: cpustate->preg = info->i; break; |
711 | | case CPUINFO_INT_REGISTER + TMS32051_TREG0: cpustate->treg0 = info->i; break; |
712 | | case CPUINFO_INT_REGISTER + TMS32051_TREG1: cpustate->treg1 = info->i; break; |
713 | | case CPUINFO_INT_REGISTER + TMS32051_TREG2: cpustate->treg2 = info->i; break; |
714 | | case CPUINFO_INT_REGISTER + TMS32051_BMAR: cpustate->bmar = info->i; break; |
715 | | case CPUINFO_INT_REGISTER + TMS32051_BRCR: cpustate->brcr = info->i; break; |
716 | | case CPUINFO_INT_REGISTER + TMS32051_INDX: cpustate->indx = info->i; break; |
717 | | case CPUINFO_INT_REGISTER + TMS32051_DBMR: cpustate->dbmr = info->i; break; |
718 | | case CPUINFO_INT_REGISTER + TMS32051_ARCR: cpustate->arcr = info->i; break; |
719 | | case CPUINFO_INT_REGISTER + TMS32051_DP: cpustate->st0.dp = info->i; break; |
720 | | case CPUINFO_INT_REGISTER + TMS32051_ARP: cpustate->st0.arp = info->i; break; |
721 | | case CPUINFO_INT_REGISTER + TMS32051_ARB: cpustate->st1.arb = info->i; break; |
722 | | case CPUINFO_INT_REGISTER + TMS32051_AR0: cpustate->ar[0] = info->i; break; |
723 | | case CPUINFO_INT_REGISTER + TMS32051_AR1: cpustate->ar[1] = info->i; break; |
724 | | case CPUINFO_INT_REGISTER + TMS32051_AR2: cpustate->ar[2] = info->i; break; |
725 | | case CPUINFO_INT_REGISTER + TMS32051_AR3: cpustate->ar[3] = info->i; break; |
726 | | case CPUINFO_INT_REGISTER + TMS32051_AR4: cpustate->ar[4] = info->i; break; |
727 | | case CPUINFO_INT_REGISTER + TMS32051_AR5: cpustate->ar[5] = info->i; break; |
728 | | case CPUINFO_INT_REGISTER + TMS32051_AR6: cpustate->ar[6] = info->i; break; |
729 | | case CPUINFO_INT_REGISTER + TMS32051_AR7: cpustate->ar[7] = info->i; break; |
730 | | |
731 | | default: CPU_SET_INFO_CALL(tms); break; |
732 | | } |
733 | | } |
734 | | |
735 | | CPU_GET_INFO( tms32051 ) |
736 | | { |
737 | | switch(state) |
738 | | { |
739 | | /* --- the following bits of info are returned as pointers to data or functions --- */ |
740 | | case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(tms32051); break; |
741 | | |
742 | | /* --- the following bits of info are returned as NULL-terminated strings --- */ |
743 | | case CPUINFO_STR_NAME: strcpy(info->s, "TMS32051"); break; |
744 | | case CPUINFO_STR_SHORTNAME: strcpy(info->s, "tms32051"); break; |
745 | | |
746 | | default: CPU_GET_INFO_CALL(tms); break; |
747 | | } |
748 | | } |
749 | | |
750 | | DEFINE_LEGACY_CPU_DEVICE(TMS32051, tms32051); |
trunk/src/emu/cpu/tms32051/32051ops.h
r26840 | r26841 | |
1 | | static void (*const tms32051_opcode_table[256])(tms32051_state *cpustate) = |
| 1 | const tms32051_device::opcode_func tms32051_device::s_opcode_table[256] = |
2 | 2 | { |
3 | 3 | /* 0x00 - 0x0f */ |
4 | | op_lar_mem, op_lar_mem, op_lar_mem, op_lar_mem, |
5 | | op_lar_mem, op_lar_mem, op_lar_mem, op_lar_mem, |
6 | | op_lamm, op_smmr, op_subc, op_rpt_mem, |
7 | | op_out, op_ldp_mem, op_lst_st0, op_lst_st1, |
| 4 | &tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem, |
| 5 | &tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem, &tms32051_device::op_lar_mem, |
| 6 | &tms32051_device::op_lamm, &tms32051_device::op_smmr, &tms32051_device::op_subc, &tms32051_device::op_rpt_mem, |
| 7 | &tms32051_device::op_out, &tms32051_device::op_ldp_mem, &tms32051_device::op_lst_st0, &tms32051_device::op_lst_st1, |
8 | 8 | /* 0x10 - 0x1f */ |
9 | | op_lacc_mem, op_lacc_mem, op_lacc_mem, op_lacc_mem, |
10 | | op_lacc_mem, op_lacc_mem, op_lacc_mem, op_lacc_mem, |
11 | | op_lacc_mem, op_lacc_mem, op_lacc_mem, op_lacc_mem, |
12 | | op_lacc_mem, op_lacc_mem, op_lacc_mem, op_lacc_mem, |
| 9 | &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, |
| 10 | &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, |
| 11 | &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, |
| 12 | &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, &tms32051_device::op_lacc_mem, |
13 | 13 | /* 0x20 - 0x2f */ |
14 | | op_add_mem, op_add_mem, op_add_mem, op_add_mem, |
15 | | op_add_mem, op_add_mem, op_add_mem, op_add_mem, |
16 | | op_add_mem, op_add_mem, op_add_mem, op_add_mem, |
17 | | op_add_mem, op_add_mem, op_add_mem, op_add_mem, |
| 14 | &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, |
| 15 | &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, |
| 16 | &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, |
| 17 | &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, &tms32051_device::op_add_mem, |
18 | 18 | /* 0x30 - 0x3f */ |
19 | | op_sub_mem, op_sub_mem, op_sub_mem, op_sub_mem, |
20 | | op_sub_mem, op_sub_mem, op_sub_mem, op_sub_mem, |
21 | | op_sub_mem, op_sub_mem, op_sub_mem, op_sub_mem, |
22 | | op_sub_mem, op_sub_mem, op_sub_mem, op_sub_mem, |
| 19 | &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, |
| 20 | &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, |
| 21 | &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, |
| 22 | &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, &tms32051_device::op_sub_mem, |
23 | 23 | /* 0x40 - 0x4f */ |
24 | | op_bit, op_bit, op_bit, op_bit, |
25 | | op_bit, op_bit, op_bit, op_bit, |
26 | | op_bit, op_bit, op_bit, op_bit, |
27 | | op_bit, op_bit, op_bit, op_bit, |
| 24 | &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, |
| 25 | &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, |
| 26 | &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, |
| 27 | &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, &tms32051_device::op_bit, |
28 | 28 | /* 0x50 - 0x5f */ |
29 | | op_mpya, op_mpys, op_sqra, op_sqrs, |
30 | | op_mpy_mem, op_mpyu, op_invalid, op_bldp, |
31 | | op_xpl_dbmr, op_opl_dbmr, op_apl_dbmr, op_cpl_dbmr, |
32 | | op_xpl_imm, op_opl_imm, op_apl_imm, op_cpl_imm, |
| 29 | &tms32051_device::op_mpya, &tms32051_device::op_mpys, &tms32051_device::op_sqra, &tms32051_device::op_sqrs, |
| 30 | &tms32051_device::op_mpy_mem, &tms32051_device::op_mpyu, &tms32051_device::op_invalid, &tms32051_device::op_bldp, |
| 31 | &tms32051_device::op_xpl_dbmr, &tms32051_device::op_opl_dbmr, &tms32051_device::op_apl_dbmr, &tms32051_device::op_cpl_dbmr, |
| 32 | &tms32051_device::op_xpl_imm, &tms32051_device::op_opl_imm, &tms32051_device::op_apl_imm, &tms32051_device::op_cpl_imm, |
33 | 33 | /* 0x60 - 0x6f */ |
34 | | op_addc, op_add_s16_mem, op_adds, op_addt, |
35 | | op_subb, op_sub_s16_mem, op_subs, op_subt, |
36 | | op_zalr, op_lacl_mem, op_lacc_s16_mem,op_lact, |
37 | | op_xor_mem, op_or_mem, op_and_mem, op_bitt, |
| 34 | &tms32051_device::op_addc, &tms32051_device::op_add_s16_mem, &tms32051_device::op_adds, &tms32051_device::op_addt, |
| 35 | &tms32051_device::op_subb, &tms32051_device::op_sub_s16_mem, &tms32051_device::op_subs, &tms32051_device::op_subt, |
| 36 | &tms32051_device::op_zalr, &tms32051_device::op_lacl_mem, &tms32051_device::op_lacc_s16_mem,&tms32051_device::op_lact, |
| 37 | &tms32051_device::op_xor_mem, &tms32051_device::op_or_mem, &tms32051_device::op_and_mem, &tms32051_device::op_bitt, |
38 | 38 | /* 0x70 - 0x7f */ |
39 | | op_lta, op_ltp, op_ltd, op_lt, |
40 | | op_lts, op_lph, op_pshd, op_dmov, |
41 | | op_adrk, op_b, op_call, op_banz, |
42 | | op_sbrk, op_bd, op_calld, op_banzd, |
| 39 | &tms32051_device::op_lta, &tms32051_device::op_ltp, &tms32051_device::op_ltd, &tms32051_device::op_lt, |
| 40 | &tms32051_device::op_lts, &tms32051_device::op_lph, &tms32051_device::op_pshd, &tms32051_device::op_dmov, |
| 41 | &tms32051_device::op_adrk, &tms32051_device::op_b, &tms32051_device::op_call, &tms32051_device::op_banz, |
| 42 | &tms32051_device::op_sbrk, &tms32051_device::op_bd, &tms32051_device::op_calld, &tms32051_device::op_banzd, |
43 | 43 | /* 0x80 - 0x8f */ |
44 | | op_sar, op_sar, op_sar, op_sar, |
45 | | op_sar, op_sar, op_sar, op_sar, |
46 | | op_samm, op_lmmr, op_popd, op_mar, |
47 | | op_spl, op_sph, op_sst_st0, op_sst_st1, |
| 44 | &tms32051_device::op_sar, &tms32051_device::op_sar, &tms32051_device::op_sar, &tms32051_device::op_sar, |
| 45 | &tms32051_device::op_sar, &tms32051_device::op_sar, &tms32051_device::op_sar, &tms32051_device::op_sar, |
| 46 | &tms32051_device::op_samm, &tms32051_device::op_lmmr, &tms32051_device::op_popd, &tms32051_device::op_mar, |
| 47 | &tms32051_device::op_spl, &tms32051_device::op_sph, &tms32051_device::op_sst_st0, &tms32051_device::op_sst_st1, |
48 | 48 | /* 0x90 - 0x9f */ |
49 | | op_sacl, op_sacl, op_sacl, op_sacl, |
50 | | op_sacl, op_sacl, op_sacl, op_sacl, |
51 | | op_sach, op_sach, op_sach, op_sach, |
52 | | op_sach, op_sach, op_sach, op_sach, |
| 49 | &tms32051_device::op_sacl, &tms32051_device::op_sacl, &tms32051_device::op_sacl, &tms32051_device::op_sacl, |
| 50 | &tms32051_device::op_sacl, &tms32051_device::op_sacl, &tms32051_device::op_sacl, &tms32051_device::op_sacl, |
| 51 | &tms32051_device::op_sach, &tms32051_device::op_sach, &tms32051_device::op_sach, &tms32051_device::op_sach, |
| 52 | &tms32051_device::op_sach, &tms32051_device::op_sach, &tms32051_device::op_sach, &tms32051_device::op_sach, |
53 | 53 | /* 0xa0 - 0xaf */ |
54 | | op_norm, op_invalid, op_mac, op_macd, |
55 | | op_blpd_bmar, op_blpd_imm, op_tblr, op_tblw, |
56 | | op_bldd_slimm, op_bldd_dlimm, op_mads, op_madd, |
57 | | op_bldd_sbmar, op_bldd_dbmar, op_splk, op_in, |
| 54 | &tms32051_device::op_norm, &tms32051_device::op_invalid, &tms32051_device::op_mac, &tms32051_device::op_macd, |
| 55 | &tms32051_device::op_blpd_bmar, &tms32051_device::op_blpd_imm, &tms32051_device::op_tblr, &tms32051_device::op_tblw, |
| 56 | &tms32051_device::op_bldd_slimm, &tms32051_device::op_bldd_dlimm, &tms32051_device::op_mads, &tms32051_device::op_madd, |
| 57 | &tms32051_device::op_bldd_sbmar, &tms32051_device::op_bldd_dbmar, &tms32051_device::op_splk, &tms32051_device::op_in, |
58 | 58 | /* 0xb0 - 0xbf */ |
59 | | op_lar_simm, op_lar_simm, op_lar_simm, op_lar_simm, |
60 | | op_lar_simm, op_lar_simm, op_lar_simm, op_lar_simm, |
61 | | op_add_simm, op_lacl_simm, op_sub_simm, op_rpt_simm, |
62 | | op_ldp_imm, op_ldp_imm, op_group_be, op_group_bf, |
| 59 | &tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm, |
| 60 | &tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm, &tms32051_device::op_lar_simm, |
| 61 | &tms32051_device::op_add_simm, &tms32051_device::op_lacl_simm, &tms32051_device::op_sub_simm, &tms32051_device::op_rpt_simm, |
| 62 | &tms32051_device::op_ldp_imm, &tms32051_device::op_ldp_imm, &tms32051_device::op_group_be, &tms32051_device::op_group_bf, |
63 | 63 | /* 0xc0 - 0xcf */ |
64 | | op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm, |
65 | | op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm, |
66 | | op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm, |
67 | | op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm, |
| 64 | &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, |
| 65 | &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, |
| 66 | &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, |
| 67 | &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, |
68 | 68 | /* 0xd0 - 0xdf */ |
69 | | op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm, |
70 | | op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm, |
71 | | op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm, |
72 | | op_mpy_simm, op_mpy_simm, op_mpy_simm, op_mpy_simm, |
| 69 | &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, |
| 70 | &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, |
| 71 | &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, |
| 72 | &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, &tms32051_device::op_mpy_simm, |
73 | 73 | /* 0xe0 - 0xef */ |
74 | | op_bcnd, op_bcnd, op_bcnd, op_bcnd, |
75 | | op_xc, op_xc, op_xc, op_xc, |
76 | | op_cc, op_cc, op_cc, op_cc, |
77 | | op_retc, op_retc, op_retc, op_retc, |
| 74 | &tms32051_device::op_bcnd, &tms32051_device::op_bcnd, &tms32051_device::op_bcnd, &tms32051_device::op_bcnd, |
| 75 | &tms32051_device::op_xc, &tms32051_device::op_xc, &tms32051_device::op_xc, &tms32051_device::op_xc, |
| 76 | &tms32051_device::op_cc, &tms32051_device::op_cc, &tms32051_device::op_cc, &tms32051_device::op_cc, |
| 77 | &tms32051_device::op_retc, &tms32051_device::op_retc, &tms32051_device::op_retc, &tms32051_device::op_retc, |
78 | 78 | /* 0xf0 - 0xff */ |
79 | | op_bcndd, op_bcndd, op_bcndd, op_bcndd, |
80 | | op_xc, op_xc, op_xc, op_xc, |
81 | | op_ccd, op_ccd, op_ccd, op_ccd, |
82 | | op_retcd, op_retcd, op_retcd, op_retcd |
| 79 | &tms32051_device::op_bcndd, &tms32051_device::op_bcndd, &tms32051_device::op_bcndd, &tms32051_device::op_bcndd, |
| 80 | &tms32051_device::op_xc, &tms32051_device::op_xc, &tms32051_device::op_xc, &tms32051_device::op_xc, |
| 81 | &tms32051_device::op_ccd, &tms32051_device::op_ccd, &tms32051_device::op_ccd, &tms32051_device::op_ccd, |
| 82 | &tms32051_device::op_retcd, &tms32051_device::op_retcd, &tms32051_device::op_retcd, &tms32051_device::op_retcd |
83 | 83 | }; |
84 | 84 | |
85 | | static void (*const tms32051_opcode_table_be[256])(tms32051_state *cpustate) = |
| 85 | const tms32051_device::opcode_func tms32051_device::s_opcode_table_be[256] = |
86 | 86 | { |
87 | 87 | /* 0x00 - 0x0f */ |
88 | | op_abs, op_cmpl, op_neg, op_pac, |
89 | | op_apac, op_spac, op_invalid, op_invalid, |
90 | | op_invalid, op_sfl, op_sfr, op_invalid, |
91 | | op_rol, op_ror, op_invalid, op_invalid, |
| 88 | &tms32051_device::op_abs, &tms32051_device::op_cmpl, &tms32051_device::op_neg, &tms32051_device::op_pac, |
| 89 | &tms32051_device::op_apac, &tms32051_device::op_spac, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 90 | &tms32051_device::op_invalid, &tms32051_device::op_sfl, &tms32051_device::op_sfr, &tms32051_device::op_invalid, |
| 91 | &tms32051_device::op_rol, &tms32051_device::op_ror, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
92 | 92 | /* 0x10 - 0x1f */ |
93 | | op_addb, op_adcb, op_andb, op_orb, |
94 | | op_rolb, op_rorb, op_sflb, op_sfrb, |
95 | | op_sbb, op_sbbb, op_xorb, op_crgt, |
96 | | op_crlt, op_exar, op_sacb, op_lacb, |
| 93 | &tms32051_device::op_addb, &tms32051_device::op_adcb, &tms32051_device::op_andb, &tms32051_device::op_orb, |
| 94 | &tms32051_device::op_rolb, &tms32051_device::op_rorb, &tms32051_device::op_sflb, &tms32051_device::op_sfrb, |
| 95 | &tms32051_device::op_sbb, &tms32051_device::op_sbbb, &tms32051_device::op_xorb, &tms32051_device::op_crgt, |
| 96 | &tms32051_device::op_crlt, &tms32051_device::op_exar, &tms32051_device::op_sacb, &tms32051_device::op_lacb, |
97 | 97 | /* 0x20 - 0x2f */ |
98 | | op_bacc, op_baccd, op_idle, op_idle2, |
99 | | op_invalid, op_invalid, op_invalid, op_invalid, |
100 | | op_invalid, op_invalid, op_invalid, op_invalid, |
101 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 98 | &tms32051_device::op_bacc, &tms32051_device::op_baccd, &tms32051_device::op_idle, &tms32051_device::op_idle2, |
| 99 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 100 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 101 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
102 | 102 | /* 0x30 - 0x3f */ |
103 | | op_cala, op_invalid, op_pop, op_invalid, |
104 | | op_invalid, op_invalid, op_invalid, op_invalid, |
105 | | op_reti, op_invalid, op_rete, op_invalid, |
106 | | op_push, op_calad, op_invalid, op_invalid, |
| 103 | &tms32051_device::op_cala, &tms32051_device::op_invalid, &tms32051_device::op_pop, &tms32051_device::op_invalid, |
| 104 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 105 | &tms32051_device::op_reti, &tms32051_device::op_invalid, &tms32051_device::op_rete, &tms32051_device::op_invalid, |
| 106 | &tms32051_device::op_push, &tms32051_device::op_calad, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
107 | 107 | /* 0x40 - 0x4f */ |
108 | | op_clrc_intm, op_setc_intm, op_clrc_ov, op_setc_ov, |
109 | | op_clrc_cnf, op_setc_cnf, op_clrc_ext, op_setc_ext, |
110 | | op_clrc_hold, op_setc_hold, op_clrc_tc, op_setc_tc, |
111 | | op_clrc_xf, op_setc_xf, op_clrc_carry, op_setc_carry, |
| 108 | &tms32051_device::op_clrc_intm, &tms32051_device::op_setc_intm, &tms32051_device::op_clrc_ov, &tms32051_device::op_setc_ov, |
| 109 | &tms32051_device::op_clrc_cnf, &tms32051_device::op_setc_cnf, &tms32051_device::op_clrc_ext, &tms32051_device::op_setc_ext, |
| 110 | &tms32051_device::op_clrc_hold, &tms32051_device::op_setc_hold, &tms32051_device::op_clrc_tc, &tms32051_device::op_setc_tc, |
| 111 | &tms32051_device::op_clrc_xf, &tms32051_device::op_setc_xf, &tms32051_device::op_clrc_carry, &tms32051_device::op_setc_carry, |
112 | 112 | /* 0x50 - 0x5f */ |
113 | | op_invalid, op_trap, op_nmi, op_invalid, |
114 | | op_invalid, op_invalid, op_invalid, op_invalid, |
115 | | op_zpr, op_zap, op_sath, op_satl, |
116 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 113 | &tms32051_device::op_invalid, &tms32051_device::op_trap, &tms32051_device::op_nmi, &tms32051_device::op_invalid, |
| 114 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 115 | &tms32051_device::op_zpr, &tms32051_device::op_zap, &tms32051_device::op_sath, &tms32051_device::op_satl, |
| 116 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
117 | 117 | /* 0x60 - 0x6f */ |
118 | | op_intr, op_intr, op_intr, op_intr, |
119 | | op_intr, op_intr, op_intr, op_intr, |
120 | | op_intr, op_intr, op_intr, op_intr, |
121 | | op_intr, op_intr, op_intr, op_intr, |
| 118 | &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, |
| 119 | &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, |
| 120 | &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, |
| 121 | &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, |
122 | 122 | /* 0x70 - 0x7f */ |
123 | | op_intr, op_intr, op_intr, op_intr, |
124 | | op_intr, op_intr, op_intr, op_intr, |
125 | | op_intr, op_intr, op_intr, op_intr, |
126 | | op_intr, op_intr, op_intr, op_intr, |
| 123 | &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, |
| 124 | &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, |
| 125 | &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, |
| 126 | &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, &tms32051_device::op_intr, |
127 | 127 | /* 0x80 - 0x8f */ |
128 | | op_mpy_limm, op_and_s16_limm,op_or_s16_limm, op_xor_s16_limm, |
129 | | op_invalid, op_invalid, op_invalid, op_invalid, |
130 | | op_invalid, op_invalid, op_invalid, op_invalid, |
131 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 128 | &tms32051_device::op_mpy_limm, &tms32051_device::op_and_s16_limm,&tms32051_device::op_or_s16_limm, &tms32051_device::op_xor_s16_limm, |
| 129 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 130 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 131 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
132 | 132 | /* 0x90 - 0x9f */ |
133 | | op_invalid, op_invalid, op_invalid, op_invalid, |
134 | | op_invalid, op_invalid, op_invalid, op_invalid, |
135 | | op_invalid, op_invalid, op_invalid, op_invalid, |
136 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 133 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 134 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 135 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 136 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
137 | 137 | /* 0xa0 - 0xaf */ |
138 | | op_invalid, op_invalid, op_invalid, op_invalid, |
139 | | op_invalid, op_invalid, op_invalid, op_invalid, |
140 | | op_invalid, op_invalid, op_invalid, op_invalid, |
141 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 138 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 139 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 140 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 141 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
142 | 142 | /* 0xb0 - 0xbf */ |
143 | | op_invalid, op_invalid, op_invalid, op_invalid, |
144 | | op_invalid, op_invalid, op_invalid, op_invalid, |
145 | | op_invalid, op_invalid, op_invalid, op_invalid, |
146 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 143 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 144 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 145 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 146 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
147 | 147 | /* 0xc0 - 0xcf */ |
148 | | op_invalid, op_invalid, op_invalid, op_invalid, |
149 | | op_rpt_limm, op_rptz, op_rptb, op_invalid, |
150 | | op_invalid, op_invalid, op_invalid, op_invalid, |
151 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 148 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 149 | &tms32051_device::op_rpt_limm, &tms32051_device::op_rptz, &tms32051_device::op_rptb, &tms32051_device::op_invalid, |
| 150 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 151 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
152 | 152 | /* 0xd0 - 0xdf */ |
153 | | op_invalid, op_invalid, op_invalid, op_invalid, |
154 | | op_invalid, op_invalid, op_invalid, op_invalid, |
155 | | op_invalid, op_invalid, op_invalid, op_invalid, |
156 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 153 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 154 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 155 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 156 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
157 | 157 | /* 0xe0 - 0xef */ |
158 | | op_invalid, op_invalid, op_invalid, op_invalid, |
159 | | op_invalid, op_invalid, op_invalid, op_invalid, |
160 | | op_invalid, op_invalid, op_invalid, op_invalid, |
161 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 158 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 159 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 160 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 161 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
162 | 162 | /* 0xf0 - 0xff */ |
163 | | op_invalid, op_invalid, op_invalid, op_invalid, |
164 | | op_invalid, op_invalid, op_invalid, op_invalid, |
165 | | op_invalid, op_invalid, op_invalid, op_invalid, |
166 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 163 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 164 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 165 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 166 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
167 | 167 | }; |
168 | 168 | |
169 | | static void (*const tms32051_opcode_table_bf[256])(tms32051_state *cpustate) = |
| 169 | const tms32051_device::opcode_func tms32051_device::s_opcode_table_bf[256] = |
170 | 170 | { |
171 | 171 | /* 0x00 - 0x0f */ |
172 | | op_spm, op_spm, op_spm, op_spm, |
173 | | op_invalid, op_invalid, op_invalid, op_invalid, |
174 | | op_lar_limm, op_lar_limm, op_lar_limm, op_lar_limm, |
175 | | op_lar_limm, op_lar_limm, op_lar_limm, op_lar_limm, |
| 172 | &tms32051_device::op_spm, &tms32051_device::op_spm, &tms32051_device::op_spm, &tms32051_device::op_spm, |
| 173 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 174 | &tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm, |
| 175 | &tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm, &tms32051_device::op_lar_limm, |
176 | 176 | /* 0x10 - 0x1f */ |
177 | | op_invalid, op_invalid, op_invalid, op_invalid, |
178 | | op_invalid, op_invalid, op_invalid, op_invalid, |
179 | | op_invalid, op_invalid, op_invalid, op_invalid, |
180 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 177 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 178 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 179 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 180 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
181 | 181 | /* 0x20 - 0x2f */ |
182 | | op_invalid, op_invalid, op_invalid, op_invalid, |
183 | | op_invalid, op_invalid, op_invalid, op_invalid, |
184 | | op_invalid, op_invalid, op_invalid, op_invalid, |
185 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 182 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 183 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 184 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 185 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
186 | 186 | /* 0x30 - 0x3f */ |
187 | | op_invalid, op_invalid, op_invalid, op_invalid, |
188 | | op_invalid, op_invalid, op_invalid, op_invalid, |
189 | | op_invalid, op_invalid, op_invalid, op_invalid, |
190 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 187 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 188 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 189 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 190 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
191 | 191 | /* 0x40 - 0x4f */ |
192 | | op_invalid, op_invalid, op_invalid, op_invalid, |
193 | | op_cmpr, op_cmpr, op_cmpr, op_cmpr, |
194 | | op_invalid, op_invalid, op_invalid, op_invalid, |
195 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 192 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 193 | &tms32051_device::op_cmpr, &tms32051_device::op_cmpr, &tms32051_device::op_cmpr, &tms32051_device::op_cmpr, |
| 194 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 195 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
196 | 196 | /* 0x50 - 0x5f */ |
197 | | op_invalid, op_invalid, op_invalid, op_invalid, |
198 | | op_invalid, op_invalid, op_invalid, op_invalid, |
199 | | op_invalid, op_invalid, op_invalid, op_invalid, |
200 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 197 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 198 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 199 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 200 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
201 | 201 | /* 0x60 - 0x6f */ |
202 | | op_invalid, op_invalid, op_invalid, op_invalid, |
203 | | op_invalid, op_invalid, op_invalid, op_invalid, |
204 | | op_invalid, op_invalid, op_invalid, op_invalid, |
205 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 202 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 203 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 204 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 205 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
206 | 206 | /* 0x70 - 0x7f */ |
207 | | op_invalid, op_invalid, op_invalid, op_invalid, |
208 | | op_invalid, op_invalid, op_invalid, op_invalid, |
209 | | op_invalid, op_invalid, op_invalid, op_invalid, |
210 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 207 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 208 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 209 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 210 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
211 | 211 | /* 0x80 - 0x8f */ |
212 | | op_lacc_limm, op_lacc_limm, op_lacc_limm, op_lacc_limm, |
213 | | op_lacc_limm, op_lacc_limm, op_lacc_limm, op_lacc_limm, |
214 | | op_lacc_limm, op_lacc_limm, op_lacc_limm, op_lacc_limm, |
215 | | op_lacc_limm, op_lacc_limm, op_lacc_limm, op_lacc_limm, |
| 212 | &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, |
| 213 | &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, |
| 214 | &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, |
| 215 | &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, &tms32051_device::op_lacc_limm, |
216 | 216 | /* 0x90 - 0x9f */ |
217 | | op_add_limm, op_add_limm, op_add_limm, op_add_limm, |
218 | | op_add_limm, op_add_limm, op_add_limm, op_add_limm, |
219 | | op_add_limm, op_add_limm, op_add_limm, op_add_limm, |
220 | | op_add_limm, op_add_limm, op_add_limm, op_add_limm, |
| 217 | &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, |
| 218 | &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, |
| 219 | &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, |
| 220 | &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, &tms32051_device::op_add_limm, |
221 | 221 | /* 0xa0 - 0xaf */ |
222 | | op_sub_limm, op_sub_limm, op_sub_limm, op_sub_limm, |
223 | | op_sub_limm, op_sub_limm, op_sub_limm, op_sub_limm, |
224 | | op_sub_limm, op_sub_limm, op_sub_limm, op_sub_limm, |
225 | | op_sub_limm, op_sub_limm, op_sub_limm, op_sub_limm, |
| 222 | &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, |
| 223 | &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, |
| 224 | &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, |
| 225 | &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, &tms32051_device::op_sub_limm, |
226 | 226 | /* 0xb0 - 0xbf */ |
227 | | op_and_limm, op_and_limm, op_and_limm, op_and_limm, |
228 | | op_and_limm, op_and_limm, op_and_limm, op_and_limm, |
229 | | op_and_limm, op_and_limm, op_and_limm, op_and_limm, |
230 | | op_and_limm, op_and_limm, op_and_limm, op_and_limm, |
| 227 | &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, |
| 228 | &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, |
| 229 | &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, |
| 230 | &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, &tms32051_device::op_and_limm, |
231 | 231 | /* 0xc0 - 0xcf */ |
232 | | op_or_limm, op_or_limm, op_or_limm, op_or_limm, |
233 | | op_or_limm, op_or_limm, op_or_limm, op_or_limm, |
234 | | op_or_limm, op_or_limm, op_or_limm, op_or_limm, |
235 | | op_or_limm, op_or_limm, op_or_limm, op_or_limm, |
| 232 | &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, |
| 233 | &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, |
| 234 | &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, |
| 235 | &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, &tms32051_device::op_or_limm, |
236 | 236 | /* 0xd0 - 0xdf */ |
237 | | op_xor_limm, op_xor_limm, op_xor_limm, op_xor_limm, |
238 | | op_xor_limm, op_xor_limm, op_xor_limm, op_xor_limm, |
239 | | op_xor_limm, op_xor_limm, op_xor_limm, op_xor_limm, |
240 | | op_xor_limm, op_xor_limm, op_xor_limm, op_xor_limm, |
| 237 | &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, |
| 238 | &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, |
| 239 | &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, |
| 240 | &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, &tms32051_device::op_xor_limm, |
241 | 241 | /* 0xe0 - 0xef */ |
242 | | op_bsar, op_bsar, op_bsar, op_bsar, |
243 | | op_bsar, op_bsar, op_bsar, op_bsar, |
244 | | op_bsar, op_bsar, op_bsar, op_bsar, |
245 | | op_bsar, op_bsar, op_bsar, op_bsar, |
| 242 | &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, |
| 243 | &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, |
| 244 | &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, |
| 245 | &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, &tms32051_device::op_bsar, |
246 | 246 | /* 0xf0 - 0xff */ |
247 | | op_invalid, op_invalid, op_invalid, op_invalid, |
248 | | op_invalid, op_invalid, op_invalid, op_invalid, |
249 | | op_invalid, op_invalid, op_invalid, op_invalid, |
250 | | op_invalid, op_invalid, op_invalid, op_invalid, |
| 247 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 248 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 249 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
| 250 | &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, &tms32051_device::op_invalid, |
251 | 251 | }; |