sim: msp430: use new common trace print helpers
[deliverable/binutils-gdb.git] / sim / msp430 / msp430-sim.c
1 /* Simulator for TI MSP430 and MSP430X
2
3 Copyright (C) 2013-2015 Free Software Foundation, Inc.
4 Contributed by Red Hat.
5 Based on sim/bfin/bfin-sim.c which was contributed by Analog Devices, Inc.
6
7 This file is part of simulators.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21
22 #include "config.h"
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <inttypes.h>
27 #include <unistd.h>
28 #include <assert.h>
29 #include "bfd.h"
30 #include "opcode/msp430-decode.h"
31 #include "sim-main.h"
32 #include "dis-asm.h"
33 #include "targ-vals.h"
34 #include "trace.h"
35
36 static int
37 loader_write_mem (SIM_DESC sd,
38 SIM_ADDR taddr,
39 const unsigned char *buf,
40 int bytes)
41 {
42 SIM_CPU *cpu = MSP430_CPU (sd);
43 return sim_core_write_buffer (sd, cpu, write_map, buf, taddr, bytes);
44 }
45
46 static sim_cia
47 msp430_pc_fetch (SIM_CPU *cpu)
48 {
49 return cpu->state.regs[0];
50 }
51
52 static void
53 msp430_pc_store (SIM_CPU *cpu, sim_cia newpc)
54 {
55 cpu->state.regs[0] = newpc;
56 }
57
58 static long
59 lookup_symbol (SIM_DESC sd, const char *name)
60 {
61 struct bfd *abfd = STATE_PROG_BFD (sd);
62 asymbol **symbol_table = STATE_SYMBOL_TABLE (sd);
63 long number_of_symbols = STATE_NUM_SYMBOLS (sd);
64 long i;
65
66 if (symbol_table == NULL)
67 {
68 long storage_needed;
69
70 storage_needed = bfd_get_symtab_upper_bound (abfd);
71 if (storage_needed <= 0)
72 return -1;
73
74 STATE_SYMBOL_TABLE (sd) = symbol_table = xmalloc (storage_needed);
75 STATE_NUM_SYMBOLS (sd) = number_of_symbols =
76 bfd_canonicalize_symtab (abfd, symbol_table);
77 }
78
79 for (i = 0; i < number_of_symbols; i++)
80 if (strcmp (symbol_table[i]->name, name) == 0)
81 {
82 long val = symbol_table[i]->section->vma + symbol_table[i]->value;
83 return val;
84 }
85 return -1;
86 }
87
88 static int
89 msp430_reg_fetch (SIM_CPU *cpu, int regno, unsigned char *buf, int len)
90 {
91 if (0 <= regno && regno < 16)
92 {
93 if (len == 2)
94 {
95 int val = cpu->state.regs[regno];
96 buf[0] = val & 0xff;
97 buf[1] = (val >> 8) & 0xff;
98 return 0;
99 }
100 else if (len == 4)
101 {
102 int val = cpu->state.regs[regno];
103 buf[0] = val & 0xff;
104 buf[1] = (val >> 8) & 0xff;
105 buf[2] = (val >> 16) & 0x0f; /* Registers are only 20 bits wide. */
106 buf[3] = 0;
107 return 0;
108 }
109 else
110 return -1;
111 }
112 else
113 return -1;
114 }
115
116 static int
117 msp430_reg_store (SIM_CPU *cpu, int regno, unsigned char *buf, int len)
118 {
119 if (0 <= regno && regno < 16)
120 {
121 if (len == 2)
122 {
123 cpu->state.regs[regno] = (buf[1] << 8) | buf[0];
124 return len;
125 }
126
127 if (len == 4)
128 {
129 cpu->state.regs[regno] = ((buf[2] << 16) & 0xf0000)
130 | (buf[1] << 8) | buf[0];
131 return len;
132 }
133 }
134
135 return -1;
136 }
137
138 static inline void
139 msp430_initialize_cpu (SIM_DESC sd, SIM_CPU *cpu)
140 {
141 memset (&cpu->state, 0, sizeof (cpu->state));
142 }
143
144 SIM_DESC
145 sim_open (SIM_OPEN_KIND kind,
146 struct host_callback_struct *callback,
147 struct bfd *abfd,
148 char **argv)
149 {
150 SIM_DESC sd = sim_state_alloc (kind, callback);
151 char c;
152 struct bfd *prog_bfd;
153
154 /* Initialise the simulator. */
155
156 if (sim_cpu_alloc_all (sd, 1, /*cgen_cpu_max_extra_bytes ()*/0) != SIM_RC_OK)
157 {
158 sim_state_free (sd);
159 return 0;
160 }
161
162 if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
163 {
164 sim_state_free (sd);
165 return 0;
166 }
167
168 if (sim_parse_args (sd, argv) != SIM_RC_OK)
169 {
170 sim_state_free (sd);
171 return 0;
172 }
173
174 CPU_PC_FETCH (MSP430_CPU (sd)) = msp430_pc_fetch;
175 CPU_PC_STORE (MSP430_CPU (sd)) = msp430_pc_store;
176 CPU_REG_FETCH (MSP430_CPU (sd)) = msp430_reg_fetch;
177 CPU_REG_STORE (MSP430_CPU (sd)) = msp430_reg_store;
178
179 /* Allocate memory if none specified by user.
180 Note - these values match the memory regions in the libgloss/msp430/msp430[xl]-sim.ld scripts. */
181 if (sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, &c, 0x2, 1) == 0)
182 sim_do_commandf (sd, "memory-region 0,0x20"); /* Needed by the GDB testsuite. */
183 if (sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, &c, 0x200, 1) == 0)
184 sim_do_commandf (sd, "memory-region 0x200,0xfd00"); /* RAM and/or ROM */
185 if (sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, &c, 0xfffe, 1) == 0)
186 sim_do_commandf (sd, "memory-region 0xffc0,0x40"); /* VECTORS. */
187 if (sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, &c, 0x10000, 1) == 0)
188 sim_do_commandf (sd, "memory-region 0x10000,0x80000"); /* HIGH FLASH RAM. */
189 if (sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, &c, 0x90000, 1) == 0)
190 sim_do_commandf (sd, "memory-region 0x90000,0x70000"); /* HIGH ROM. */
191
192 /* Check for/establish the a reference program image. */
193 if (sim_analyze_program (sd,
194 (STATE_PROG_ARGV (sd) != NULL
195 ? *STATE_PROG_ARGV (sd)
196 : NULL), abfd) != SIM_RC_OK)
197 {
198 sim_state_free (sd);
199 return 0;
200 }
201
202 prog_bfd = sim_load_file (sd, argv[0], callback,
203 "the program",
204 STATE_PROG_BFD (sd),
205 0 /* verbose */,
206 1 /* use LMA instead of VMA */,
207 loader_write_mem);
208 /* Allow prog_bfd to be NULL - this is needed by the GDB testsuite. */
209
210 /* Establish any remaining configuration options. */
211 if (sim_config (sd) != SIM_RC_OK)
212 {
213 sim_state_free (sd);
214 return 0;
215 }
216
217 if (sim_post_argv_init (sd) != SIM_RC_OK)
218 {
219 sim_state_free (sd);
220 return 0;
221 }
222
223 /* CPU specific initialization. */
224 assert (MAX_NR_PROCESSORS == 1);
225 msp430_initialize_cpu (sd, MSP430_CPU (sd));
226
227 msp430_trace_init (STATE_PROG_BFD (sd));
228
229 if (prog_bfd != NULL)
230 {
231 MSP430_CPU (sd)->state.cio_breakpoint = lookup_symbol (sd, "C$$IO$$");
232 MSP430_CPU (sd)->state.cio_buffer = lookup_symbol (sd, "__CIOBUF__");
233 if (MSP430_CPU (sd)->state.cio_buffer == -1)
234 MSP430_CPU (sd)->state.cio_buffer = lookup_symbol (sd, "_CIOBUF_");
235 }
236
237 return sd;
238 }
239
240 void
241 sim_close (SIM_DESC sd,
242 int quitting)
243 {
244 free (STATE_SYMBOL_TABLE (sd));
245 sim_state_free (sd);
246 }
247
248 SIM_RC
249 sim_create_inferior (SIM_DESC sd,
250 struct bfd *abfd,
251 char **argv,
252 char **env)
253 {
254 unsigned char resetv[2];
255 int c;
256 int new_pc;
257
258 /* Set the PC to the default reset vector if available. */
259 c = sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, resetv, 0xfffe, 2);
260 new_pc = resetv[0] + 256 * resetv[1];
261
262 /* If the reset vector isn't initialized, then use the ELF entry. */
263 if (abfd != NULL && !new_pc)
264 new_pc = bfd_get_start_address (abfd);
265
266 sim_pc_set (MSP430_CPU (sd), new_pc);
267 msp430_pc_store (MSP430_CPU (sd), new_pc);
268
269 return SIM_RC_OK;
270 }
271
272 typedef struct
273 {
274 SIM_DESC sd;
275 int gb_addr;
276 } Get_Byte_Local_Data;
277
278 static int
279 msp430_getbyte (void *vld)
280 {
281 Get_Byte_Local_Data *ld = (Get_Byte_Local_Data *)vld;
282 char buf[1];
283 SIM_DESC sd = ld->sd;
284
285 sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, buf, ld->gb_addr, 1);
286 ld->gb_addr ++;
287 return buf[0];
288 }
289
290 #define REG(N) MSP430_CPU (sd)->state.regs[(N)]
291 #define PC REG(MSR_PC)
292 #define SP REG(MSR_SP)
293 #define SR REG(MSR_SR)
294
295 static const char *
296 register_names[] =
297 {
298 "PC", "SP", "SR", "CG", "R4", "R5", "R6", "R7", "R8",
299 "R9", "R10", "R11", "R12", "R13", "R14", "R15"
300 };
301
302 static void
303 trace_reg_put (SIM_DESC sd, int n, unsigned int v)
304 {
305 TRACE_VPU (MSP430_CPU (sd), "PUT: %#x -> %s", v, register_names[n]);
306 REG (n) = v;
307 }
308
309 static unsigned int
310 trace_reg_get (SIM_DESC sd, int n)
311 {
312 TRACE_VPU (MSP430_CPU (sd), "GET: %s -> %#x", register_names[n], REG (n));
313 return REG (n);
314 }
315
316 #define REG_PUT(N,V) trace_reg_put (sd, N, V)
317 #define REG_GET(N) trace_reg_get (sd, N)
318
319 /* Hardware multiply (and accumulate) support. */
320
321 static unsigned int
322 zero_ext (unsigned int v, unsigned int bits)
323 {
324 v &= ((1 << bits) - 1);
325 return v;
326 }
327
328 static signed long long
329 sign_ext (signed long long v, unsigned int bits)
330 {
331 signed long long sb = 1LL << (bits-1); /* Sign bit. */
332 signed long long mb = (1LL << (bits-1)) - 1LL; /* Mantissa bits. */
333
334 if (v & sb)
335 v = v | ~mb;
336 else
337 v = v & mb;
338 return v;
339 }
340
341 static int
342 get_op (SIM_DESC sd, MSP430_Opcode_Decoded *opc, int n)
343 {
344 MSP430_Opcode_Operand *op = opc->op + n;
345 int rv;
346 int addr;
347 unsigned char buf[4];
348 int incval = 0;
349
350 switch (op->type)
351 {
352 case MSP430_Operand_Immediate:
353 rv = op->addend;
354 break;
355 case MSP430_Operand_Register:
356 rv = REG_GET (op->reg);
357 break;
358 case MSP430_Operand_Indirect:
359 case MSP430_Operand_Indirect_Postinc:
360 addr = op->addend;
361 if (op->reg != MSR_None)
362 {
363 int reg = REG_GET (op->reg);
364 int sign = opc->ofs_430x ? 20 : 16;
365
366 /* Index values are signed. */
367 if (addr & (1 << (sign - 1)))
368 addr |= -1 << sign;
369
370 addr += reg;
371
372 /* For MSP430 instructions the sum is limited to 16 bits if the
373 address in the index register is less than 64k even if we are
374 running on an MSP430X CPU. This is for MSP430 compatibility. */
375 if (reg < 0x10000 && ! opc->ofs_430x)
376 {
377 if (addr >= 0x10000)
378 fprintf (stderr, " XXX WRAPPING ADDRESS %x on read\n", addr);
379
380 addr &= 0xffff;
381 }
382 }
383 addr &= 0xfffff;
384 switch (opc->size)
385 {
386 case 8:
387 sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, buf, addr, 1);
388 rv = buf[0];
389 break;
390 case 16:
391 sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, buf, addr, 2);
392 rv = buf[0] | (buf[1] << 8);
393 break;
394 case 20:
395 case 32:
396 sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, buf, addr, 4);
397 rv = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
398 break;
399 default:
400 assert (! opc->size);
401 break;
402 }
403 #if 0
404 /* Hack - MSP430X5438 serial port status register. */
405 if (addr == 0x5dd)
406 rv = 2;
407 #endif
408 if (addr >= 0x130 && addr <= 0x15B)
409 {
410 switch (addr)
411 {
412 case 0x13A:
413 switch (HWMULT (sd, hwmult_type))
414 {
415 case UNSIGN_MAC_32:
416 case UNSIGN_32:
417 rv = zero_ext (HWMULT (sd, hwmult_result), 16);
418 break;
419 case SIGN_MAC_32:
420 case SIGN_32:
421 rv = sign_ext (HWMULT (sd, hwmult_signed_result), 16);
422 break;
423 }
424 break;
425
426 case 0x13C:
427 switch (HWMULT (sd, hwmult_type))
428 {
429 case UNSIGN_MAC_32:
430 case UNSIGN_32:
431 rv = zero_ext (HWMULT (sd, hwmult_result) >> 16, 16);
432 break;
433
434 case SIGN_MAC_32:
435 case SIGN_32:
436 rv = sign_ext (HWMULT (sd, hwmult_signed_result) >> 16, 16);
437 break;
438 }
439 break;
440
441 case 0x13E:
442 switch (HWMULT (sd, hwmult_type))
443 {
444 case UNSIGN_32:
445 rv = 0;
446 break;
447 case SIGN_32:
448 rv = HWMULT (sd, hwmult_signed_result) < 0 ? -1 : 0;
449 break;
450 case UNSIGN_MAC_32:
451 rv = 0; /* FIXME: Should be carry of last accumulate. */
452 break;
453 case SIGN_MAC_32:
454 rv = HWMULT (sd, hwmult_signed_accumulator) < 0 ? -1 : 0;
455 break;
456 }
457 break;
458
459 case 0x154:
460 rv = zero_ext (HWMULT (sd, hw32mult_result), 16);
461 break;
462
463 case 0x156:
464 rv = zero_ext (HWMULT (sd, hw32mult_result) >> 16, 16);
465 break;
466
467 case 0x158:
468 rv = zero_ext (HWMULT (sd, hw32mult_result) >> 32, 16);
469 break;
470
471 case 0x15A:
472 switch (HWMULT (sd, hw32mult_type))
473 {
474 case UNSIGN_64: rv = zero_ext (HWMULT (sd, hw32mult_result) >> 48, 16); break;
475 case SIGN_64: rv = sign_ext (HWMULT (sd, hw32mult_result) >> 48, 16); break;
476 }
477 break;
478
479 default:
480 fprintf (stderr, "unimplemented HW MULT read from %x!\n", addr);
481 break;
482 }
483 }
484
485 TRACE_MEMORY (MSP430_CPU (sd), "GET: [%#x].%d -> %#x", addr, opc->size,
486 rv);
487 break;
488
489 default:
490 fprintf (stderr, "invalid operand %d type %d\n", n, op->type);
491 abort ();
492 }
493
494 switch (opc->size)
495 {
496 case 8:
497 rv &= 0xff;
498 incval = 1;
499 break;
500 case 16:
501 rv &= 0xffff;
502 incval = 2;
503 break;
504 case 20:
505 rv &= 0xfffff;
506 incval = 4;
507 break;
508 case 32:
509 rv &= 0xffffffff;
510 incval = 4;
511 break;
512 }
513
514 if (op->type == MSP430_Operand_Indirect_Postinc)
515 REG_PUT (op->reg, REG_GET (op->reg) + incval);
516
517 return rv;
518 }
519
520 static int
521 put_op (SIM_DESC sd, MSP430_Opcode_Decoded *opc, int n, int val)
522 {
523 MSP430_Opcode_Operand *op = opc->op + n;
524 int rv;
525 int addr;
526 unsigned char buf[4];
527 int incval = 0;
528
529 switch (opc->size)
530 {
531 case 8:
532 val &= 0xff;
533 break;
534 case 16:
535 val &= 0xffff;
536 break;
537 case 20:
538 val &= 0xfffff;
539 break;
540 case 32:
541 val &= 0xffffffff;
542 break;
543 }
544
545 switch (op->type)
546 {
547 case MSP430_Operand_Register:
548 REG (op->reg) = val;
549 REG_PUT (op->reg, val);
550 break;
551 case MSP430_Operand_Indirect:
552 case MSP430_Operand_Indirect_Postinc:
553 addr = op->addend;
554 if (op->reg != MSR_None)
555 {
556 int reg = REG_GET (op->reg);
557 int sign = opc->ofs_430x ? 20 : 16;
558
559 /* Index values are signed. */
560 if (addr & (1 << (sign - 1)))
561 addr |= -1 << sign;
562
563 addr += reg;
564
565 /* For MSP430 instructions the sum is limited to 16 bits if the
566 address in the index register is less than 64k even if we are
567 running on an MSP430X CPU. This is for MSP430 compatibility. */
568 if (reg < 0x10000 && ! opc->ofs_430x)
569 {
570 if (addr >= 0x10000)
571 fprintf (stderr, " XXX WRAPPING ADDRESS %x on write\n", addr);
572
573 addr &= 0xffff;
574 }
575 }
576 addr &= 0xfffff;
577
578 TRACE_MEMORY (MSP430_CPU (sd), "PUT: [%#x].%d <- %#x", addr, opc->size,
579 val);
580 #if 0
581 /* Hack - MSP430X5438 serial port transmit register. */
582 if (addr == 0x5ce)
583 putchar (val);
584 #endif
585 if (addr >= 0x130 && addr <= 0x15B)
586 {
587 signed int a,b;
588
589 /* Hardware Multiply emulation. */
590 assert (opc->size == 16);
591
592 switch (addr)
593 {
594 case 0x130: HWMULT (sd, hwmult_op1) = val; HWMULT (sd, hwmult_type) = UNSIGN_32; break;
595 case 0x132: HWMULT (sd, hwmult_op1) = val; HWMULT (sd, hwmult_type) = SIGN_32; break;
596 case 0x134: HWMULT (sd, hwmult_op1) = val; HWMULT (sd, hwmult_type) = UNSIGN_MAC_32; break;
597 case 0x136: HWMULT (sd, hwmult_op1) = val; HWMULT (sd, hwmult_type) = SIGN_MAC_32; break;
598
599 case 0x138: HWMULT (sd, hwmult_op2) = val;
600 switch (HWMULT (sd, hwmult_type))
601 {
602 case UNSIGN_32:
603 HWMULT (sd, hwmult_result) = HWMULT (sd, hwmult_op1) * HWMULT (sd, hwmult_op2);
604 HWMULT (sd, hwmult_signed_result) = (signed) HWMULT (sd, hwmult_result);
605 HWMULT (sd, hwmult_accumulator) = HWMULT (sd, hwmult_signed_accumulator) = 0;
606 break;
607
608 case SIGN_32:
609 a = sign_ext (HWMULT (sd, hwmult_op1), 16);
610 b = sign_ext (HWMULT (sd, hwmult_op2), 16);
611 HWMULT (sd, hwmult_signed_result) = a * b;
612 HWMULT (sd, hwmult_result) = (unsigned) HWMULT (sd, hwmult_signed_result);
613 HWMULT (sd, hwmult_accumulator) = HWMULT (sd, hwmult_signed_accumulator) = 0;
614 break;
615
616 case UNSIGN_MAC_32:
617 HWMULT (sd, hwmult_accumulator) += HWMULT (sd, hwmult_op1) * HWMULT (sd, hwmult_op2);
618 HWMULT (sd, hwmult_signed_accumulator) += HWMULT (sd, hwmult_op1) * HWMULT (sd, hwmult_op2);
619 HWMULT (sd, hwmult_result) = HWMULT (sd, hwmult_accumulator);
620 HWMULT (sd, hwmult_signed_result) = HWMULT (sd, hwmult_signed_accumulator);
621 break;
622
623 case SIGN_MAC_32:
624 a = sign_ext (HWMULT (sd, hwmult_op1), 16);
625 b = sign_ext (HWMULT (sd, hwmult_op2), 16);
626 HWMULT (sd, hwmult_accumulator) += a * b;
627 HWMULT (sd, hwmult_signed_accumulator) += a * b;
628 HWMULT (sd, hwmult_result) = HWMULT (sd, hwmult_accumulator);
629 HWMULT (sd, hwmult_signed_result) = HWMULT (sd, hwmult_signed_accumulator);
630 break;
631 }
632 break;
633
634 case 0x13a:
635 /* Copy into LOW result... */
636 switch (HWMULT (sd, hwmult_type))
637 {
638 case UNSIGN_MAC_32:
639 case UNSIGN_32:
640 HWMULT (sd, hwmult_accumulator) = HWMULT (sd, hwmult_result) = zero_ext (val, 16);
641 HWMULT (sd, hwmult_signed_accumulator) = sign_ext (val, 16);
642 break;
643 case SIGN_MAC_32:
644 case SIGN_32:
645 HWMULT (sd, hwmult_signed_accumulator) = HWMULT (sd, hwmult_result) = sign_ext (val, 16);
646 HWMULT (sd, hwmult_accumulator) = zero_ext (val, 16);
647 break;
648 }
649 break;
650
651 case 0x140:
652 HWMULT (sd, hw32mult_op1) = val;
653 HWMULT (sd, hw32mult_type) = UNSIGN_64;
654 break;
655 case 0x142:
656 HWMULT (sd, hw32mult_op1) = (HWMULT (sd, hw32mult_op1) & 0xFFFF) | (val << 16);
657 break;
658 case 0x144:
659 HWMULT (sd, hw32mult_op1) = val;
660 HWMULT (sd, hw32mult_type) = SIGN_64;
661 break;
662 case 0x146:
663 HWMULT (sd, hw32mult_op1) = (HWMULT (sd, hw32mult_op1) & 0xFFFF) | (val << 16);
664 break;
665 case 0x150:
666 HWMULT (sd, hw32mult_op2) = val;
667 break;
668
669 case 0x152:
670 HWMULT (sd, hw32mult_op2) = (HWMULT (sd, hw32mult_op2) & 0xFFFF) | (val << 16);
671 switch (HWMULT (sd, hw32mult_type))
672 {
673 case UNSIGN_64:
674 HWMULT (sd, hw32mult_result) = HWMULT (sd, hw32mult_op1) * HWMULT (sd, hw32mult_op2);
675 break;
676 case SIGN_64:
677 HWMULT (sd, hw32mult_result) = sign_ext (HWMULT (sd, hw32mult_op1), 32)
678 * sign_ext (HWMULT (sd, hw32mult_op2), 32);
679 break;
680 }
681 break;
682
683 default:
684 fprintf (stderr, "unimplemented HW MULT write to %x!\n", addr);
685 break;
686 }
687 }
688
689 switch (opc->size)
690 {
691 case 8:
692 buf[0] = val;
693 sim_core_write_buffer (sd, MSP430_CPU (sd), write_map, buf, addr, 1);
694 break;
695 case 16:
696 buf[0] = val;
697 buf[1] = val >> 8;
698 sim_core_write_buffer (sd, MSP430_CPU (sd), write_map, buf, addr, 2);
699 break;
700 case 20:
701 case 32:
702 buf[0] = val;
703 buf[1] = val >> 8;
704 buf[2] = val >> 16;
705 buf[3] = val >> 24;
706 sim_core_write_buffer (sd, MSP430_CPU (sd), write_map, buf, addr, 4);
707 break;
708 default:
709 assert (! opc->size);
710 break;
711 }
712 break;
713 default:
714 fprintf (stderr, "invalid operand %d type %d\n", n, op->type);
715 abort ();
716 }
717
718 switch (opc->size)
719 {
720 case 8:
721 rv &= 0xff;
722 incval = 1;
723 break;
724 case 16:
725 rv &= 0xffff;
726 incval = 2;
727 break;
728 case 20:
729 rv &= 0xfffff;
730 incval = 4;
731 break;
732 case 32:
733 rv &= 0xffffffff;
734 incval = 4;
735 break;
736 }
737
738 if (op->type == MSP430_Operand_Indirect_Postinc)
739 {
740 int new_val = REG_GET (op->reg) + incval;
741 /* SP is always word-aligned. */
742 if (op->reg == MSR_SP && (new_val & 1))
743 new_val ++;
744 REG_PUT (op->reg, new_val);
745 }
746
747 return rv;
748 }
749
750 static void
751 mem_put_val (SIM_DESC sd, int addr, int val, int bits)
752 {
753 MSP430_Opcode_Decoded opc;
754
755 opc.size = bits;
756 opc.op[0].type = MSP430_Operand_Indirect;
757 opc.op[0].addend = addr;
758 opc.op[0].reg = MSR_None;
759 put_op (sd, &opc, 0, val);
760 }
761
762 static int
763 mem_get_val (SIM_DESC sd, int addr, int bits)
764 {
765 MSP430_Opcode_Decoded opc;
766
767 opc.size = bits;
768 opc.op[0].type = MSP430_Operand_Indirect;
769 opc.op[0].addend = addr;
770 opc.op[0].reg = MSR_None;
771 return get_op (sd, &opc, 0);
772 }
773
774 #define CIO_OPEN (0xF0)
775 #define CIO_CLOSE (0xF1)
776 #define CIO_READ (0xF2)
777 #define CIO_WRITE (0xF3)
778 #define CIO_LSEEK (0xF4)
779 #define CIO_UNLINK (0xF5)
780 #define CIO_GETENV (0xF6)
781 #define CIO_RENAME (0xF7)
782 #define CIO_GETTIME (0xF8)
783 #define CIO_GETCLK (0xF9)
784 #define CIO_SYNC (0xFF)
785
786 #define CIO_I(n) (parms[(n)] + parms[(n)+1] * 256)
787 #define CIO_L(n) (parms[(n)] + parms[(n)+1] * 256 \
788 + parms[(n)+2] * 65536 + parms[(n)+3] * 16777216)
789
790 static void
791 msp430_cio (SIM_DESC sd)
792 {
793 /* A block of data at __CIOBUF__ describes the I/O operation to
794 perform. */
795
796 unsigned char raw_parms[13];
797 unsigned char parms[8];
798 long length;
799 int command;
800 unsigned char buffer[512];
801 long ret_buflen = 0;
802 long fd, addr, len, rv;
803
804 sim_core_read_buffer (sd, MSP430_CPU (sd), 0, parms,
805 MSP430_CPU (sd)->state.cio_buffer, 5);
806 length = CIO_I (0);
807 command = parms[2];
808
809 sim_core_read_buffer (sd, MSP430_CPU (sd), 0, parms,
810 MSP430_CPU (sd)->state.cio_buffer + 3, 8);
811
812 sim_core_read_buffer (sd, MSP430_CPU (sd), 0, buffer,
813 MSP430_CPU (sd)->state.cio_buffer + 11, length);
814
815 switch (command)
816 {
817 case CIO_WRITE:
818 fd = CIO_I (0);
819 len = CIO_I (2);
820
821 rv = write (fd, buffer, len);
822 parms[0] = rv & 0xff;
823 parms[1] = rv >> 8;
824
825 break;
826 }
827
828 sim_core_write_buffer (sd, MSP430_CPU (sd), 0, parms,
829 MSP430_CPU (sd)->state.cio_buffer + 4, 8);
830 if (ret_buflen)
831 sim_core_write_buffer (sd, MSP430_CPU (sd), 0, buffer,
832 MSP430_CPU (sd)->state.cio_buffer + 12, ret_buflen);
833 }
834
835 #define SRC get_op (sd, opcode, 1)
836 #define DSRC get_op (sd, opcode, 0)
837 #define DEST(V) put_op (sd, opcode, 0, (V))
838
839 static int
840 msp430_dis_read (bfd_vma memaddr,
841 bfd_byte *myaddr,
842 unsigned int length,
843 struct disassemble_info *dinfo)
844 {
845 SIM_DESC sd = dinfo->private_data;
846 sim_core_read_buffer (sd, MSP430_CPU (sd), 0, myaddr, memaddr, length);
847 return 0;
848 }
849
850 #define DO_ALU(OP,SOP,MORE) \
851 { \
852 int s1 = DSRC; \
853 int s2 = SRC; \
854 int result = s1 OP s2 MORE; \
855 TRACE_ALU (MSP430_CPU (sd), "ALU: %#x %s %#x %s = %#x", s1, SOP, \
856 s2, #MORE, result); \
857 DEST (result); \
858 }
859
860 #define SIGN (1 << (opcode->size - 1))
861 #define POS(x) (((x) & SIGN) ? 0 : 1)
862 #define NEG(x) (((x) & SIGN) ? 1 : 0)
863
864 #define SX(v) sign_ext (v, opcode->size)
865 #define ZX(v) zero_ext (v, opcode->size)
866
867 static char *
868 flags2string (int f)
869 {
870 static char buf[2][6];
871 static int bi = 0;
872 char *bp = buf[bi];
873
874 bi = (bi + 1) % 2;
875
876 bp[0] = f & MSP430_FLAG_V ? 'V' : '-';
877 bp[1] = f & MSP430_FLAG_N ? 'N' : '-';
878 bp[2] = f & MSP430_FLAG_Z ? 'Z' : '-';
879 bp[3] = f & MSP430_FLAG_C ? 'C' : '-';
880 bp[4] = 0;
881 return bp;
882 }
883
884 /* Random number that won't show up in our usual logic. */
885 #define MAGIC_OVERFLOW 0x55000F
886
887 static void
888 do_flags (SIM_DESC sd,
889 MSP430_Opcode_Decoded *opcode,
890 int vnz_val, /* Signed result. */
891 int carry,
892 int overflow)
893 {
894 int f = SR;
895 int new_f = 0;
896 int signbit = 1 << (opcode->size - 1);
897
898 f &= ~opcode->flags_0;
899 f &= ~opcode->flags_set;
900 f |= opcode->flags_1;
901
902 if (vnz_val & signbit)
903 new_f |= MSP430_FLAG_N;
904 if (! (vnz_val & ((signbit << 1) - 1)))
905 new_f |= MSP430_FLAG_Z;
906 if (overflow == MAGIC_OVERFLOW)
907 {
908 if (vnz_val != SX (vnz_val))
909 new_f |= MSP430_FLAG_V;
910 }
911 else
912 if (overflow)
913 new_f |= MSP430_FLAG_V;
914 if (carry)
915 new_f |= MSP430_FLAG_C;
916
917 new_f = f | (new_f & opcode->flags_set);
918 if (SR != new_f)
919 TRACE_ALU (MSP430_CPU (sd), "FLAGS: %s -> %s", flags2string (SR),
920 flags2string (new_f));
921 else
922 TRACE_ALU (MSP430_CPU (sd), "FLAGS: %s", flags2string (new_f));
923 SR = new_f;
924 }
925
926 #define FLAGS(vnz,c) do_flags (sd, opcode, vnz, c, MAGIC_OVERFLOW)
927 #define FLAGSV(vnz,c,v) do_flags (sd, opcode, vnz, c, v)
928
929 /* These two assume unsigned 16-bit (four digit) words.
930 Mask off unwanted bits for byte operations. */
931
932 static int
933 bcd_to_binary (int v)
934 {
935 int r = ( ((v >> 0) & 0xf) * 1
936 + ((v >> 4) & 0xf) * 10
937 + ((v >> 8) & 0xf) * 100
938 + ((v >> 12) & 0xf) * 1000);
939 return r;
940 }
941
942 static int
943 binary_to_bcd (int v)
944 {
945 int r = ( ((v / 1) % 10) << 0
946 | ((v / 10) % 10) << 4
947 | ((v / 100) % 10) << 8
948 | ((v / 1000) % 10) << 12);
949 return r;
950 }
951
952 static int
953 syscall_read_mem (host_callback *cb, struct cb_syscall *sc,
954 unsigned long taddr, char *buf, int bytes)
955 {
956 SIM_DESC sd = (SIM_DESC) sc->p1;
957 SIM_CPU *cpu = (SIM_CPU *) sc->p2;
958
959 return sim_core_read_buffer (sd, cpu, read_map, buf, taddr, bytes);
960 }
961
962 static int
963 syscall_write_mem (host_callback *cb, struct cb_syscall *sc,
964 unsigned long taddr, const char *buf, int bytes)
965 {
966 SIM_DESC sd = (SIM_DESC) sc->p1;
967 SIM_CPU *cpu = (SIM_CPU *) sc->p2;
968
969 return sim_core_write_buffer (sd, cpu, write_map, buf, taddr, bytes);
970 }
971
972 static const char *
973 cond_string (int cond)
974 {
975 switch (cond)
976 {
977 case MSC_nz:
978 return "NZ";
979 case MSC_z:
980 return "Z";
981 case MSC_nc:
982 return "NC";
983 case MSC_c:
984 return "C";
985 case MSC_n:
986 return "N";
987 case MSC_ge:
988 return "GE";
989 case MSC_l:
990 return "L";
991 case MSC_true:
992 return "MP";
993 default:
994 return "??";
995 }
996 }
997
998 /* Checks a CALL to address CALL_ADDR. If this is a special
999 syscall address then the call is simulated and non-zero is
1000 returned. Otherwise 0 is returned. */
1001
1002 static int
1003 maybe_perform_syscall (SIM_DESC sd, int call_addr)
1004 {
1005 if (call_addr == 0x00160)
1006 {
1007 int i;
1008
1009 for (i = 0; i < 16; i++)
1010 {
1011 if (i % 4 == 0)
1012 fprintf (stderr, "\t");
1013 fprintf (stderr, "R%-2d %05x ", i, MSP430_CPU (sd)->state.regs[i]);
1014 if (i % 4 == 3)
1015 {
1016 int sp = SP + (3 - (i / 4)) * 2;
1017 unsigned char buf[2];
1018
1019 sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, buf, sp, 2);
1020
1021 fprintf (stderr, "\tSP%+d: %04x", sp - SP,
1022 buf[0] + buf[1] * 256);
1023
1024 if (i / 4 == 0)
1025 {
1026 int flags = SR;
1027
1028 fprintf (stderr, flags & 0x100 ? " V" : " -");
1029 fprintf (stderr, flags & 0x004 ? "N" : "-");
1030 fprintf (stderr, flags & 0x002 ? "Z" : "-");
1031 fprintf (stderr, flags & 0x001 ? "C" : "-");
1032 }
1033
1034 fprintf (stderr, "\n");
1035 }
1036 }
1037 return 1;
1038 }
1039
1040 if ((call_addr & ~0x3f) == 0x00180)
1041 {
1042 /* Syscall! */
1043 int syscall_num = call_addr & 0x3f;
1044 host_callback *cb = STATE_CALLBACK (sd);
1045 CB_SYSCALL sc;
1046
1047 CB_SYSCALL_INIT (&sc);
1048
1049 sc.func = syscall_num;
1050 sc.arg1 = MSP430_CPU (sd)->state.regs[12];
1051 sc.arg2 = MSP430_CPU (sd)->state.regs[13];
1052 sc.arg3 = MSP430_CPU (sd)->state.regs[14];
1053 sc.arg4 = MSP430_CPU (sd)->state.regs[15];
1054
1055 if (TRACE_SYSCALL_P (MSP430_CPU (sd)))
1056 {
1057 const char *syscall_name = "*unknown*";
1058
1059 switch (syscall_num)
1060 {
1061 case TARGET_SYS_exit:
1062 syscall_name = "exit(%d)";
1063 break;
1064 case TARGET_SYS_open:
1065 syscall_name = "open(%#x,%#x)";
1066 break;
1067 case TARGET_SYS_close:
1068 syscall_name = "close(%d)";
1069 break;
1070 case TARGET_SYS_read:
1071 syscall_name = "read(%d,%#x,%d)";
1072 break;
1073 case TARGET_SYS_write:
1074 syscall_name = "write(%d,%#x,%d)";
1075 break;
1076 }
1077 trace_generic (sd, MSP430_CPU (sd), TRACE_SYSCALL_IDX,
1078 syscall_name, sc.arg1, sc.arg2, sc.arg3, sc.arg4);
1079 }
1080
1081 /* Handle SYS_exit here. */
1082 if (syscall_num == 1)
1083 {
1084 sim_engine_halt (sd, MSP430_CPU (sd), NULL,
1085 MSP430_CPU (sd)->state.regs[0],
1086 sim_exited, sc.arg1);
1087 return 1;
1088 }
1089
1090 sc.p1 = sd;
1091 sc.p2 = MSP430_CPU (sd);
1092 sc.read_mem = syscall_read_mem;
1093 sc.write_mem = syscall_write_mem;
1094
1095 cb_syscall (cb, &sc);
1096
1097 TRACE_SYSCALL (MSP430_CPU (sd), "returns %ld", sc.result);
1098
1099 MSP430_CPU (sd)->state.regs[12] = sc.result;
1100 return 1;
1101 }
1102
1103 return 0;
1104 }
1105
1106 static void
1107 msp430_step_once (SIM_DESC sd)
1108 {
1109 Get_Byte_Local_Data ld;
1110 unsigned char buf[100];
1111 int i;
1112 int opsize;
1113 unsigned int opcode_pc;
1114 MSP430_Opcode_Decoded opcode_buf;
1115 MSP430_Opcode_Decoded *opcode = &opcode_buf;
1116 int s1, s2, result;
1117 int u1, u2, uresult;
1118 int c, reg;
1119 int sp;
1120 int carry_to_use;
1121 int n_repeats;
1122 int rept;
1123 int op_bytes, op_bits;
1124
1125 PC &= 0xfffff;
1126 opcode_pc = PC;
1127
1128 if (opcode_pc < 0x10)
1129 {
1130 fprintf (stderr, "Fault: PC(%#x) is less than 0x10\n", opcode_pc);
1131 sim_engine_halt (sd, MSP430_CPU (sd), NULL,
1132 MSP430_CPU (sd)->state.regs[0],
1133 sim_exited, -1);
1134 return;
1135 }
1136
1137 if (PC == MSP430_CPU (sd)->state.cio_breakpoint
1138 && STATE_OPEN_KIND (sd) != SIM_OPEN_DEBUG)
1139 msp430_cio (sd);
1140
1141 ld.sd = sd;
1142 ld.gb_addr = PC;
1143 opsize = msp430_decode_opcode (MSP430_CPU (sd)->state.regs[0],
1144 opcode, msp430_getbyte, &ld);
1145 PC += opsize;
1146 if (opsize <= 0)
1147 {
1148 fprintf (stderr, "Fault: undecodable opcode at %#x\n", opcode_pc);
1149 sim_engine_halt (sd, MSP430_CPU (sd), NULL,
1150 MSP430_CPU (sd)->state.regs[0],
1151 sim_exited, -1);
1152 return;
1153 }
1154
1155 if (opcode->repeat_reg)
1156 n_repeats = (MSP430_CPU (sd)->state.regs[opcode->repeats] & 0x000f) + 1;
1157 else
1158 n_repeats = opcode->repeats + 1;
1159
1160 op_bits = opcode->size;
1161 switch (op_bits)
1162 {
1163 case 8:
1164 op_bytes = 1;
1165 break;
1166 case 16:
1167 op_bytes = 2;
1168 break;
1169 case 20:
1170 case 32:
1171 op_bytes = 4;
1172 break;
1173 }
1174
1175 if (TRACE_INSN_P (MSP430_CPU (sd)))
1176 {
1177 disassemble_info info;
1178 unsigned char b[10];
1179
1180 msp430_trace_one (opcode_pc);
1181
1182 sim_core_read_buffer (sd, MSP430_CPU (sd), 0, b, opcode_pc, opsize);
1183
1184 init_disassemble_info (&info, stderr, (fprintf_ftype) fprintf);
1185 info.private_data = sd;
1186 info.read_memory_func = msp430_dis_read;
1187 fprintf (stderr, "%#8x ", opcode_pc);
1188 for (i = 0; i < opsize; i += 2)
1189 fprintf (stderr, " %02x%02x", b[i+1], b[i]);
1190 for (; i < 6; i += 2)
1191 fprintf (stderr, " ");
1192 fprintf (stderr, " ");
1193 print_insn_msp430 (opcode_pc, &info);
1194 fprintf (stderr, "\n");
1195 fflush (stdout);
1196 }
1197
1198 if (TRACE_ANY_P (MSP430_CPU (sd)))
1199 trace_prefix (sd, MSP430_CPU (sd), NULL_CIA, opcode_pc,
1200 TRACE_LINENUM_P (MSP430_CPU (sd)), NULL, 0, "");
1201
1202 carry_to_use = 0;
1203 switch (opcode->id)
1204 {
1205 case MSO_unknown:
1206 break;
1207
1208 /* Double-operand instructions. */
1209 case MSO_mov:
1210 if (opcode->n_bytes == 2
1211 && opcode->op[0].type == MSP430_Operand_Register
1212 && opcode->op[0].reg == MSR_CG
1213 && opcode->op[1].type == MSP430_Operand_Immediate
1214 && opcode->op[1].addend == 0
1215 /* A 16-bit write of #0 is a NOP; an 8-bit write is a BRK. */
1216 && opcode->size == 8)
1217 {
1218 /* This is the designated software breakpoint instruction. */
1219 PC -= opsize;
1220 sim_engine_halt (sd, MSP430_CPU (sd), NULL,
1221 MSP430_CPU (sd)->state.regs[0],
1222 sim_stopped, SIM_SIGTRAP);
1223
1224 }
1225 else
1226 {
1227 /* Otherwise, do the move. */
1228 for (rept = 0; rept < n_repeats; rept ++)
1229 {
1230 DEST (SRC);
1231 }
1232 }
1233 break;
1234
1235 case MSO_addc:
1236 for (rept = 0; rept < n_repeats; rept ++)
1237 {
1238 carry_to_use = (SR & MSP430_FLAG_C) ? 1 : 0;
1239 u1 = DSRC;
1240 u2 = SRC;
1241 s1 = SX (u1);
1242 s2 = SX (u2);
1243 uresult = u1 + u2 + carry_to_use;
1244 result = s1 + s2 + carry_to_use;
1245 TRACE_ALU (MSP430_CPU (sd), "ADDC: %#x + %#x + %d = %#x",
1246 u1, u2, carry_to_use, uresult);
1247 DEST (result);
1248 FLAGS (result, uresult != ZX (uresult));
1249 }
1250 break;
1251
1252 case MSO_add:
1253 for (rept = 0; rept < n_repeats; rept ++)
1254 {
1255 u1 = DSRC;
1256 u2 = SRC;
1257 s1 = SX (u1);
1258 s2 = SX (u2);
1259 uresult = u1 + u2;
1260 result = s1 + s2;
1261 TRACE_ALU (MSP430_CPU (sd), "ADD: %#x + %#x = %#x",
1262 u1, u2, uresult);
1263 DEST (result);
1264 FLAGS (result, uresult != ZX (uresult));
1265 }
1266 break;
1267
1268 case MSO_subc:
1269 for (rept = 0; rept < n_repeats; rept ++)
1270 {
1271 carry_to_use = (SR & MSP430_FLAG_C) ? 1 : 0;
1272 u1 = DSRC;
1273 u2 = SRC;
1274 s1 = SX (u1);
1275 s2 = SX (u2);
1276 uresult = ZX (~u2) + u1 + carry_to_use;
1277 result = s1 - s2 + (carry_to_use - 1);
1278 TRACE_ALU (MSP430_CPU (sd), "SUBC: %#x - %#x + %d = %#x",
1279 u1, u2, carry_to_use, uresult);
1280 DEST (result);
1281 FLAGS (result, uresult != ZX (uresult));
1282 }
1283 break;
1284
1285 case MSO_sub:
1286 for (rept = 0; rept < n_repeats; rept ++)
1287 {
1288 u1 = DSRC;
1289 u2 = SRC;
1290 s1 = SX (u1);
1291 s2 = SX (u2);
1292 uresult = ZX (~u2) + u1 + 1;
1293 result = SX (uresult);
1294 TRACE_ALU (MSP430_CPU (sd), "SUB: %#x - %#x = %#x",
1295 u1, u2, uresult);
1296 DEST (result);
1297 FLAGS (result, uresult != ZX (uresult));
1298 }
1299 break;
1300
1301 case MSO_cmp:
1302 for (rept = 0; rept < n_repeats; rept ++)
1303 {
1304 u1 = DSRC;
1305 u2 = SRC;
1306 s1 = SX (u1);
1307 s2 = SX (u2);
1308 uresult = ZX (~u2) + u1 + 1;
1309 result = s1 - s2;
1310 TRACE_ALU (MSP430_CPU (sd), "CMP: %#x - %#x = %x",
1311 u1, u2, uresult);
1312 FLAGS (result, uresult != ZX (uresult));
1313 }
1314 break;
1315
1316 case MSO_dadd:
1317 for (rept = 0; rept < n_repeats; rept ++)
1318 {
1319 carry_to_use = (SR & MSP430_FLAG_C) ? 1 : 0;
1320 u1 = DSRC;
1321 u2 = SRC;
1322 uresult = bcd_to_binary (u1) + bcd_to_binary (u2) + carry_to_use;
1323 result = binary_to_bcd (uresult);
1324 TRACE_ALU (MSP430_CPU (sd), "DADD: %#x + %#x + %d = %#x",
1325 u1, u2, carry_to_use, result);
1326 DEST (result);
1327 FLAGS (result, uresult > ((opcode->size == 8) ? 99 : 9999));
1328 }
1329 break;
1330
1331 case MSO_and:
1332 for (rept = 0; rept < n_repeats; rept ++)
1333 {
1334 u1 = DSRC;
1335 u2 = SRC;
1336 uresult = u1 & u2;
1337 TRACE_ALU (MSP430_CPU (sd), "AND: %#x & %#x = %#x",
1338 u1, u2, uresult);
1339 DEST (uresult);
1340 FLAGS (uresult, uresult != 0);
1341 }
1342 break;
1343
1344 case MSO_bit:
1345 for (rept = 0; rept < n_repeats; rept ++)
1346 {
1347 u1 = DSRC;
1348 u2 = SRC;
1349 uresult = u1 & u2;
1350 TRACE_ALU (MSP430_CPU (sd), "BIT: %#x & %#x -> %#x",
1351 u1, u2, uresult);
1352 FLAGS (uresult, uresult != 0);
1353 }
1354 break;
1355
1356 case MSO_bic:
1357 for (rept = 0; rept < n_repeats; rept ++)
1358 {
1359 u1 = DSRC;
1360 u2 = SRC;
1361 uresult = u1 & ~ u2;
1362 TRACE_ALU (MSP430_CPU (sd), "BIC: %#x & ~ %#x = %#x",
1363 u1, u2, uresult);
1364 DEST (uresult);
1365 }
1366 break;
1367
1368 case MSO_bis:
1369 for (rept = 0; rept < n_repeats; rept ++)
1370 {
1371 u1 = DSRC;
1372 u2 = SRC;
1373 uresult = u1 | u2;
1374 TRACE_ALU (MSP430_CPU (sd), "BIS: %#x | %#x = %#x",
1375 u1, u2, uresult);
1376 DEST (uresult);
1377 }
1378 break;
1379
1380 case MSO_xor:
1381 for (rept = 0; rept < n_repeats; rept ++)
1382 {
1383 s1 = 1 << (opcode->size - 1);
1384 u1 = DSRC;
1385 u2 = SRC;
1386 uresult = u1 ^ u2;
1387 TRACE_ALU (MSP430_CPU (sd), "XOR: %#x & %#x = %#x",
1388 u1, u2, uresult);
1389 DEST (uresult);
1390 FLAGSV (uresult, uresult != 0, (u1 & s1) && (u2 & s1));
1391 }
1392 break;
1393
1394 /* Single-operand instructions. Note: the decoder puts the same
1395 operand in SRC as in DEST, for our convenience. */
1396
1397 case MSO_rrc:
1398 for (rept = 0; rept < n_repeats; rept ++)
1399 {
1400 u1 = SRC;
1401 carry_to_use = u1 & 1;
1402 uresult = u1 >> 1;
1403 if (SR & MSP430_FLAG_C)
1404 uresult |= (1 << (opcode->size - 1));
1405 TRACE_ALU (MSP430_CPU (sd), "RRC: %#x >>= %#x",
1406 u1, uresult);
1407 DEST (uresult);
1408 FLAGS (uresult, carry_to_use);
1409 }
1410 break;
1411
1412 case MSO_swpb:
1413 for (rept = 0; rept < n_repeats; rept ++)
1414 {
1415 u1 = SRC;
1416 uresult = ((u1 >> 8) & 0x00ff) | ((u1 << 8) & 0xff00);
1417 TRACE_ALU (MSP430_CPU (sd), "SWPB: %#x -> %#x",
1418 u1, uresult);
1419 DEST (uresult);
1420 }
1421 break;
1422
1423 case MSO_rra:
1424 for (rept = 0; rept < n_repeats; rept ++)
1425 {
1426 u1 = SRC;
1427 c = u1 & 1;
1428 s1 = 1 << (opcode->size - 1);
1429 uresult = (u1 >> 1) | (u1 & s1);
1430 TRACE_ALU (MSP430_CPU (sd), "RRA: %#x >>= %#x",
1431 u1, uresult);
1432 DEST (uresult);
1433 FLAGS (uresult, c);
1434 }
1435 break;
1436
1437 case MSO_rru:
1438 for (rept = 0; rept < n_repeats; rept ++)
1439 {
1440 u1 = SRC;
1441 c = u1 & 1;
1442 uresult = (u1 >> 1);
1443 TRACE_ALU (MSP430_CPU (sd), "RRU: %#x >>= %#x",
1444 u1, uresult);
1445 DEST (uresult);
1446 FLAGS (uresult, c);
1447 }
1448 break;
1449
1450 case MSO_sxt:
1451 for (rept = 0; rept < n_repeats; rept ++)
1452 {
1453 u1 = SRC;
1454 if (u1 & 0x80)
1455 uresult = u1 | 0xfff00;
1456 else
1457 uresult = u1 & 0x000ff;
1458 TRACE_ALU (MSP430_CPU (sd), "SXT: %#x -> %#x",
1459 u1, uresult);
1460 DEST (uresult);
1461 FLAGS (uresult, c);
1462 }
1463 break;
1464
1465 case MSO_push:
1466 for (rept = 0; rept < n_repeats; rept ++)
1467 {
1468 int new_sp;
1469
1470 new_sp = REG_GET (MSR_SP) - op_bytes;
1471 /* SP is always word-aligned. */
1472 if (new_sp & 1)
1473 new_sp --;
1474 REG_PUT (MSR_SP, new_sp);
1475 u1 = SRC;
1476 mem_put_val (sd, SP, u1, op_bits);
1477 if (opcode->op[1].type == MSP430_Operand_Register)
1478 opcode->op[1].reg --;
1479 }
1480 break;
1481
1482 case MSO_pop:
1483 for (rept = 0; rept < n_repeats; rept ++)
1484 {
1485 int new_sp;
1486
1487 u1 = mem_get_val (sd, SP, op_bits);
1488 DEST (u1);
1489 if (opcode->op[0].type == MSP430_Operand_Register)
1490 opcode->op[0].reg ++;
1491 new_sp = REG_GET (MSR_SP) + op_bytes;
1492 /* SP is always word-aligned. */
1493 if (new_sp & 1)
1494 new_sp ++;
1495 REG_PUT (MSR_SP, new_sp);
1496 }
1497 break;
1498
1499 case MSO_call:
1500 u1 = SRC;
1501
1502 if (maybe_perform_syscall (sd, u1))
1503 break;
1504
1505 REG_PUT (MSR_SP, REG_GET (MSR_SP) - op_bytes);
1506 mem_put_val (sd, SP, PC, op_bits);
1507 TRACE_ALU (MSP430_CPU (sd), "CALL: func %#x ret %#x, sp %#x",
1508 u1, PC, SP);
1509 REG_PUT (MSR_PC, u1);
1510 break;
1511
1512 case MSO_reti:
1513 u1 = mem_get_val (sd, SP, 16);
1514 SR = u1 & 0xFF;
1515 SP += 2;
1516 PC = mem_get_val (sd, SP, 16);
1517 SP += 2;
1518 /* Emulate the RETI action of the 20-bit CPUX architecure.
1519 This is safe for 16-bit CPU architectures as well, since the top
1520 8-bits of SR will have been written to the stack here, and will
1521 have been read as 0. */
1522 PC |= (u1 & 0xF000) << 4;
1523 TRACE_ALU (MSP430_CPU (sd), "RETI: pc %#x sr %#x",
1524 PC, SR);
1525 break;
1526
1527 /* Jumps. */
1528
1529 case MSO_jmp:
1530 i = SRC;
1531 switch (opcode->cond)
1532 {
1533 case MSC_nz:
1534 u1 = (SR & MSP430_FLAG_Z) ? 0 : 1;
1535 break;
1536 case MSC_z:
1537 u1 = (SR & MSP430_FLAG_Z) ? 1 : 0;
1538 break;
1539 case MSC_nc:
1540 u1 = (SR & MSP430_FLAG_C) ? 0 : 1;
1541 break;
1542 case MSC_c:
1543 u1 = (SR & MSP430_FLAG_C) ? 1 : 0;
1544 break;
1545 case MSC_n:
1546 u1 = (SR & MSP430_FLAG_N) ? 1 : 0;
1547 break;
1548 case MSC_ge:
1549 u1 = (!!(SR & MSP430_FLAG_N) == !!(SR & MSP430_FLAG_V)) ? 1 : 0;
1550 break;
1551 case MSC_l:
1552 u1 = (!!(SR & MSP430_FLAG_N) == !!(SR & MSP430_FLAG_V)) ? 0 : 1;
1553 break;
1554 case MSC_true:
1555 u1 = 1;
1556 break;
1557 }
1558
1559 if (u1)
1560 {
1561 TRACE_BRANCH (MSP430_CPU (sd), "J%s: pc %#x -> %#x sr %#x, taken",
1562 cond_string (opcode->cond), PC, i, SR);
1563 PC = i;
1564 if (PC == opcode_pc)
1565 exit (0);
1566 }
1567 else
1568 TRACE_BRANCH (MSP430_CPU (sd), "J%s: pc %#x to %#x sr %#x, not taken",
1569 cond_string (opcode->cond), PC, i, SR);
1570 break;
1571
1572 default:
1573 fprintf (stderr, "error: unexpected opcode id %d\n", opcode->id);
1574 exit (1);
1575 }
1576 }
1577
1578 void
1579 sim_engine_run (SIM_DESC sd,
1580 int next_cpu_nr,
1581 int nr_cpus,
1582 int siggnal)
1583 {
1584 while (1)
1585 {
1586 msp430_step_once (sd);
1587 if (sim_events_tick (sd))
1588 sim_events_process (sd);
1589 }
1590 }
This page took 0.062237 seconds and 5 git commands to generate.