1 /* Simulator for TI MSP430 and MSP430X
3 Copyright (C) 2013-2016 Free Software Foundation, Inc.
4 Contributed by Red Hat.
5 Based on sim/bfin/bfin-sim.c which was contributed by Analog Devices, Inc.
7 This file is part of simulators.
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.
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.
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/>. */
30 #include "opcode/msp430-decode.h"
32 #include "sim-syscall.h"
34 #include "targ-vals.h"
38 loader_write_mem (SIM_DESC sd,
40 const unsigned char *buf,
43 SIM_CPU *cpu = MSP430_CPU (sd);
44 return sim_core_write_buffer (sd, cpu, write_map, buf, taddr, bytes);
48 msp430_pc_fetch (SIM_CPU *cpu)
50 return cpu->state.regs[0];
54 msp430_pc_store (SIM_CPU *cpu, sim_cia newpc)
56 cpu->state.regs[0] = newpc;
60 lookup_symbol (SIM_DESC sd, const char *name)
62 struct bfd *abfd = STATE_PROG_BFD (sd);
63 asymbol **symbol_table = STATE_SYMBOL_TABLE (sd);
64 long number_of_symbols = STATE_NUM_SYMBOLS (sd);
67 if (symbol_table == NULL)
71 storage_needed = bfd_get_symtab_upper_bound (abfd);
72 if (storage_needed <= 0)
75 STATE_SYMBOL_TABLE (sd) = symbol_table = xmalloc (storage_needed);
76 STATE_NUM_SYMBOLS (sd) = number_of_symbols =
77 bfd_canonicalize_symtab (abfd, symbol_table);
80 for (i = 0; i < number_of_symbols; i++)
81 if (strcmp (symbol_table[i]->name, name) == 0)
83 long val = symbol_table[i]->section->vma + symbol_table[i]->value;
90 msp430_reg_fetch (SIM_CPU *cpu, int regno, unsigned char *buf, int len)
92 if (0 <= regno && regno < 16)
96 int val = cpu->state.regs[regno];
98 buf[1] = (val >> 8) & 0xff;
103 int val = cpu->state.regs[regno];
105 buf[1] = (val >> 8) & 0xff;
106 buf[2] = (val >> 16) & 0x0f; /* Registers are only 20 bits wide. */
118 msp430_reg_store (SIM_CPU *cpu, int regno, unsigned char *buf, int len)
120 if (0 <= regno && regno < 16)
124 cpu->state.regs[regno] = (buf[1] << 8) | buf[0];
130 cpu->state.regs[regno] = ((buf[2] << 16) & 0xf0000)
131 | (buf[1] << 8) | buf[0];
140 msp430_initialize_cpu (SIM_DESC sd, SIM_CPU *cpu)
142 memset (&cpu->state, 0, sizeof (cpu->state));
146 sim_open (SIM_OPEN_KIND kind,
147 struct host_callback_struct *callback,
151 SIM_DESC sd = sim_state_alloc (kind, callback);
153 struct bfd *prog_bfd;
155 /* Initialise the simulator. */
157 if (sim_cpu_alloc_all (sd, 1, /*cgen_cpu_max_extra_bytes ()*/0) != SIM_RC_OK)
163 if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
169 if (sim_parse_args (sd, argv) != SIM_RC_OK)
175 CPU_PC_FETCH (MSP430_CPU (sd)) = msp430_pc_fetch;
176 CPU_PC_STORE (MSP430_CPU (sd)) = msp430_pc_store;
177 CPU_REG_FETCH (MSP430_CPU (sd)) = msp430_reg_fetch;
178 CPU_REG_STORE (MSP430_CPU (sd)) = msp430_reg_store;
180 /* Allocate memory if none specified by user.
181 Note - these values match the memory regions in the libgloss/msp430/msp430[xl]-sim.ld scripts. */
182 if (sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, &c, 0x2, 1) == 0)
183 sim_do_commandf (sd, "memory-region 0,0x20"); /* Needed by the GDB testsuite. */
184 if (sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, &c, 0x500, 1) == 0)
185 sim_do_commandf (sd, "memory-region 0x500,0xfa00"); /* RAM and/or ROM */
186 if (sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, &c, 0xfffe, 1) == 0)
187 sim_do_commandf (sd, "memory-region 0xffc0,0x40"); /* VECTORS. */
188 if (sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, &c, 0x10000, 1) == 0)
189 sim_do_commandf (sd, "memory-region 0x10000,0x80000"); /* HIGH FLASH RAM. */
190 if (sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, &c, 0x90000, 1) == 0)
191 sim_do_commandf (sd, "memory-region 0x90000,0x70000"); /* HIGH ROM. */
193 /* Check for/establish the a reference program image. */
194 if (sim_analyze_program (sd,
195 (STATE_PROG_ARGV (sd) != NULL
196 ? *STATE_PROG_ARGV (sd)
197 : NULL), abfd) != SIM_RC_OK)
203 prog_bfd = sim_load_file (sd, argv[0], callback,
207 1 /* use LMA instead of VMA */,
209 /* Allow prog_bfd to be NULL - this is needed by the GDB testsuite. */
211 /* Establish any remaining configuration options. */
212 if (sim_config (sd) != SIM_RC_OK)
218 if (sim_post_argv_init (sd) != SIM_RC_OK)
224 /* CPU specific initialization. */
225 assert (MAX_NR_PROCESSORS == 1);
226 msp430_initialize_cpu (sd, MSP430_CPU (sd));
228 msp430_trace_init (STATE_PROG_BFD (sd));
230 if (prog_bfd != NULL)
232 MSP430_CPU (sd)->state.cio_breakpoint = lookup_symbol (sd, "C$$IO$$");
233 MSP430_CPU (sd)->state.cio_buffer = lookup_symbol (sd, "__CIOBUF__");
234 if (MSP430_CPU (sd)->state.cio_buffer == -1)
235 MSP430_CPU (sd)->state.cio_buffer = lookup_symbol (sd, "_CIOBUF_");
242 msp430_sim_close (SIM_DESC sd, int quitting)
244 free (STATE_SYMBOL_TABLE (sd));
248 sim_create_inferior (SIM_DESC sd,
253 unsigned char resetv[2];
257 /* Set the PC to the default reset vector if available. */
258 c = sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, resetv, 0xfffe, 2);
259 new_pc = resetv[0] + 256 * resetv[1];
261 /* If the reset vector isn't initialized, then use the ELF entry. */
262 if (abfd != NULL && !new_pc)
263 new_pc = bfd_get_start_address (abfd);
265 sim_pc_set (MSP430_CPU (sd), new_pc);
266 msp430_pc_store (MSP430_CPU (sd), new_pc);
275 } Get_Byte_Local_Data;
278 msp430_getbyte (void *vld)
280 Get_Byte_Local_Data *ld = (Get_Byte_Local_Data *)vld;
282 SIM_DESC sd = ld->sd;
284 sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, buf, ld->gb_addr, 1);
289 #define REG(N) MSP430_CPU (sd)->state.regs[(N)]
290 #define PC REG(MSR_PC)
291 #define SP REG(MSR_SP)
292 #define SR REG(MSR_SR)
297 "PC", "SP", "SR", "CG", "R4", "R5", "R6", "R7", "R8",
298 "R9", "R10", "R11", "R12", "R13", "R14", "R15"
302 trace_reg_put (SIM_DESC sd, int n, unsigned int v)
304 TRACE_REGISTER (MSP430_CPU (sd), "PUT: %#x -> %s", v, register_names[n]);
309 trace_reg_get (SIM_DESC sd, int n)
311 TRACE_REGISTER (MSP430_CPU (sd), "GET: %s -> %#x", register_names[n], REG (n));
315 #define REG_PUT(N,V) trace_reg_put (sd, N, V)
316 #define REG_GET(N) trace_reg_get (sd, N)
318 /* Hardware multiply (and accumulate) support. */
321 zero_ext (unsigned int v, unsigned int bits)
323 v &= ((1 << bits) - 1);
327 static signed long long
328 sign_ext (signed long long v, unsigned int bits)
330 signed long long sb = 1LL << (bits-1); /* Sign bit. */
331 signed long long mb = (1LL << (bits-1)) - 1LL; /* Mantissa bits. */
341 get_op (SIM_DESC sd, MSP430_Opcode_Decoded *opc, int n)
343 MSP430_Opcode_Operand *op = opc->op + n;
346 unsigned char buf[4];
351 case MSP430_Operand_Immediate:
354 case MSP430_Operand_Register:
355 rv = REG_GET (op->reg);
357 case MSP430_Operand_Indirect:
358 case MSP430_Operand_Indirect_Postinc:
360 if (op->reg != MSR_None)
362 int reg = REG_GET (op->reg);
363 int sign = opc->ofs_430x ? 20 : 16;
365 /* Index values are signed. */
366 if (addr & (1 << (sign - 1)))
367 addr |= -(1 << sign);
371 /* For MSP430 instructions the sum is limited to 16 bits if the
372 address in the index register is less than 64k even if we are
373 running on an MSP430X CPU. This is for MSP430 compatibility. */
374 if (reg < 0x10000 && ! opc->ofs_430x)
377 fprintf (stderr, " XXX WRAPPING ADDRESS %x on read\n", addr);
386 sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, buf, addr, 1);
390 sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, buf, addr, 2);
391 rv = buf[0] | (buf[1] << 8);
395 sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, buf, addr, 4);
396 rv = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
399 assert (! opc->size);
403 /* Hack - MSP430X5438 serial port status register. */
407 if ((addr >= 0x130 && addr <= 0x15B)
408 || (addr >= 0x4C0 && addr <= 0x4EB))
414 switch (HWMULT (sd, hwmult_type))
418 rv = zero_ext (HWMULT (sd, hwmult_result), 16);
422 rv = sign_ext (HWMULT (sd, hwmult_signed_result), 16);
429 switch (HWMULT (sd, hwmult_type))
433 rv = zero_ext (HWMULT (sd, hwmult_result) >> 16, 16);
438 rv = sign_ext (HWMULT (sd, hwmult_signed_result) >> 16, 16);
445 switch (HWMULT (sd, hwmult_type))
451 rv = HWMULT (sd, hwmult_signed_result) < 0 ? -1 : 0;
454 rv = 0; /* FIXME: Should be carry of last accumulate. */
457 rv = HWMULT (sd, hwmult_signed_accumulator) < 0 ? -1 : 0;
464 rv = zero_ext (HWMULT (sd, hw32mult_result), 16);
469 rv = zero_ext (HWMULT (sd, hw32mult_result) >> 16, 16);
474 rv = zero_ext (HWMULT (sd, hw32mult_result) >> 32, 16);
479 switch (HWMULT (sd, hw32mult_type))
481 case UNSIGN_64: rv = zero_ext (HWMULT (sd, hw32mult_result) >> 48, 16); break;
482 case SIGN_64: rv = sign_ext (HWMULT (sd, hw32mult_result) >> 48, 16); break;
487 fprintf (stderr, "unimplemented HW MULT read from %x!\n", addr);
492 TRACE_MEMORY (MSP430_CPU (sd), "GET: [%#x].%d -> %#x", addr, opc->size,
497 fprintf (stderr, "invalid operand %d type %d\n", n, op->type);
521 if (op->type == MSP430_Operand_Indirect_Postinc)
522 REG_PUT (op->reg, REG_GET (op->reg) + incval);
528 put_op (SIM_DESC sd, MSP430_Opcode_Decoded *opc, int n, int val)
530 MSP430_Opcode_Operand *op = opc->op + n;
533 unsigned char buf[4];
554 case MSP430_Operand_Register:
556 REG_PUT (op->reg, val);
558 case MSP430_Operand_Indirect:
559 case MSP430_Operand_Indirect_Postinc:
561 if (op->reg != MSR_None)
563 int reg = REG_GET (op->reg);
564 int sign = opc->ofs_430x ? 20 : 16;
566 /* Index values are signed. */
567 if (addr & (1 << (sign - 1)))
568 addr |= -(1 << sign);
572 /* For MSP430 instructions the sum is limited to 16 bits if the
573 address in the index register is less than 64k even if we are
574 running on an MSP430X CPU. This is for MSP430 compatibility. */
575 if (reg < 0x10000 && ! opc->ofs_430x)
578 fprintf (stderr, " XXX WRAPPING ADDRESS %x on write\n", addr);
585 TRACE_MEMORY (MSP430_CPU (sd), "PUT: [%#x].%d <- %#x", addr, opc->size,
588 /* Hack - MSP430X5438 serial port transmit register. */
592 if ((addr >= 0x130 && addr <= 0x15B)
593 || (addr >= 0x4C0 && addr <= 0x4EB))
597 /* Hardware Multiply emulation. */
598 assert (opc->size == 16);
604 HWMULT (sd, hwmult_op1) = val;
605 HWMULT (sd, hwmult_type) = UNSIGN_32;
610 HWMULT (sd, hwmult_op1) = val;
611 HWMULT (sd, hwmult_type) = SIGN_32;
616 HWMULT (sd, hwmult_op1) = val;
617 HWMULT (sd, hwmult_type) = UNSIGN_MAC_32;
622 HWMULT (sd, hwmult_op1) = val;
623 HWMULT (sd, hwmult_type) = SIGN_MAC_32;
628 HWMULT (sd, hwmult_op2) = val;
629 switch (HWMULT (sd, hwmult_type))
632 HWMULT (sd, hwmult_result) = HWMULT (sd, hwmult_op1) * HWMULT (sd, hwmult_op2);
633 HWMULT (sd, hwmult_signed_result) = (signed) HWMULT (sd, hwmult_result);
634 HWMULT (sd, hwmult_accumulator) = HWMULT (sd, hwmult_signed_accumulator) = 0;
638 a = sign_ext (HWMULT (sd, hwmult_op1), 16);
639 b = sign_ext (HWMULT (sd, hwmult_op2), 16);
640 HWMULT (sd, hwmult_signed_result) = a * b;
641 HWMULT (sd, hwmult_result) = (unsigned) HWMULT (sd, hwmult_signed_result);
642 HWMULT (sd, hwmult_accumulator) = HWMULT (sd, hwmult_signed_accumulator) = 0;
646 HWMULT (sd, hwmult_accumulator) += HWMULT (sd, hwmult_op1) * HWMULT (sd, hwmult_op2);
647 HWMULT (sd, hwmult_signed_accumulator) += HWMULT (sd, hwmult_op1) * HWMULT (sd, hwmult_op2);
648 HWMULT (sd, hwmult_result) = HWMULT (sd, hwmult_accumulator);
649 HWMULT (sd, hwmult_signed_result) = HWMULT (sd, hwmult_signed_accumulator);
653 a = sign_ext (HWMULT (sd, hwmult_op1), 16);
654 b = sign_ext (HWMULT (sd, hwmult_op2), 16);
655 HWMULT (sd, hwmult_accumulator) += a * b;
656 HWMULT (sd, hwmult_signed_accumulator) += a * b;
657 HWMULT (sd, hwmult_result) = HWMULT (sd, hwmult_accumulator);
658 HWMULT (sd, hwmult_signed_result) = HWMULT (sd, hwmult_signed_accumulator);
665 /* Copy into LOW result... */
666 switch (HWMULT (sd, hwmult_type))
670 HWMULT (sd, hwmult_accumulator) = HWMULT (sd, hwmult_result) = zero_ext (val, 16);
671 HWMULT (sd, hwmult_signed_accumulator) = sign_ext (val, 16);
675 HWMULT (sd, hwmult_signed_accumulator) = HWMULT (sd, hwmult_result) = sign_ext (val, 16);
676 HWMULT (sd, hwmult_accumulator) = zero_ext (val, 16);
683 HWMULT (sd, hw32mult_op1) = val;
684 HWMULT (sd, hw32mult_type) = UNSIGN_64;
689 HWMULT (sd, hw32mult_op1) = (HWMULT (sd, hw32mult_op1) & 0xFFFF) | (val << 16);
694 HWMULT (sd, hw32mult_op1) = val;
695 HWMULT (sd, hw32mult_type) = SIGN_64;
700 HWMULT (sd, hw32mult_op1) = (HWMULT (sd, hw32mult_op1) & 0xFFFF) | (val << 16);
705 HWMULT (sd, hw32mult_op2) = val;
710 HWMULT (sd, hw32mult_op2) = (HWMULT (sd, hw32mult_op2) & 0xFFFF) | (val << 16);
711 switch (HWMULT (sd, hw32mult_type))
714 HWMULT (sd, hw32mult_result) = HWMULT (sd, hw32mult_op1) * HWMULT (sd, hw32mult_op2);
717 HWMULT (sd, hw32mult_result) = sign_ext (HWMULT (sd, hw32mult_op1), 32)
718 * sign_ext (HWMULT (sd, hw32mult_op2), 32);
724 fprintf (stderr, "unimplemented HW MULT write to %x!\n", addr);
733 sim_core_write_buffer (sd, MSP430_CPU (sd), write_map, buf, addr, 1);
738 sim_core_write_buffer (sd, MSP430_CPU (sd), write_map, buf, addr, 2);
746 sim_core_write_buffer (sd, MSP430_CPU (sd), write_map, buf, addr, 4);
749 assert (! opc->size);
754 fprintf (stderr, "invalid operand %d type %d\n", n, op->type);
778 if (op->type == MSP430_Operand_Indirect_Postinc)
780 int new_val = REG_GET (op->reg) + incval;
781 /* SP is always word-aligned. */
782 if (op->reg == MSR_SP && (new_val & 1))
784 REG_PUT (op->reg, new_val);
791 mem_put_val (SIM_DESC sd, int addr, int val, int bits)
793 MSP430_Opcode_Decoded opc;
796 opc.op[0].type = MSP430_Operand_Indirect;
797 opc.op[0].addend = addr;
798 opc.op[0].reg = MSR_None;
799 put_op (sd, &opc, 0, val);
803 mem_get_val (SIM_DESC sd, int addr, int bits)
805 MSP430_Opcode_Decoded opc;
808 opc.op[0].type = MSP430_Operand_Indirect;
809 opc.op[0].addend = addr;
810 opc.op[0].reg = MSR_None;
811 return get_op (sd, &opc, 0);
814 #define CIO_OPEN (0xF0)
815 #define CIO_CLOSE (0xF1)
816 #define CIO_READ (0xF2)
817 #define CIO_WRITE (0xF3)
818 #define CIO_LSEEK (0xF4)
819 #define CIO_UNLINK (0xF5)
820 #define CIO_GETENV (0xF6)
821 #define CIO_RENAME (0xF7)
822 #define CIO_GETTIME (0xF8)
823 #define CIO_GETCLK (0xF9)
824 #define CIO_SYNC (0xFF)
826 #define CIO_I(n) (parms[(n)] + parms[(n)+1] * 256)
827 #define CIO_L(n) (parms[(n)] + parms[(n)+1] * 256 \
828 + parms[(n)+2] * 65536 + parms[(n)+3] * 16777216)
831 msp430_cio (SIM_DESC sd)
833 /* A block of data at __CIOBUF__ describes the I/O operation to
836 unsigned char raw_parms[13];
837 unsigned char parms[8];
840 unsigned char buffer[512];
842 long fd, addr, len, rv;
844 sim_core_read_buffer (sd, MSP430_CPU (sd), 0, parms,
845 MSP430_CPU (sd)->state.cio_buffer, 5);
849 sim_core_read_buffer (sd, MSP430_CPU (sd), 0, parms,
850 MSP430_CPU (sd)->state.cio_buffer + 3, 8);
852 sim_core_read_buffer (sd, MSP430_CPU (sd), 0, buffer,
853 MSP430_CPU (sd)->state.cio_buffer + 11, length);
861 rv = write (fd, buffer, len);
862 parms[0] = rv & 0xff;
868 sim_core_write_buffer (sd, MSP430_CPU (sd), 0, parms,
869 MSP430_CPU (sd)->state.cio_buffer + 4, 8);
871 sim_core_write_buffer (sd, MSP430_CPU (sd), 0, buffer,
872 MSP430_CPU (sd)->state.cio_buffer + 12, ret_buflen);
875 #define SRC get_op (sd, opcode, 1)
876 #define DSRC get_op (sd, opcode, 0)
877 #define DEST(V) put_op (sd, opcode, 0, (V))
880 msp430_dis_read (bfd_vma memaddr,
883 struct disassemble_info *dinfo)
885 SIM_DESC sd = dinfo->application_data;
886 sim_core_read_buffer (sd, MSP430_CPU (sd), 0, myaddr, memaddr, length);
890 #define DO_ALU(OP,SOP,MORE) \
894 int result = s1 OP s2 MORE; \
895 TRACE_ALU (MSP430_CPU (sd), "ALU: %#x %s %#x %s = %#x", s1, SOP, \
896 s2, #MORE, result); \
900 #define SIGN (1 << (opcode->size - 1))
901 #define POS(x) (((x) & SIGN) ? 0 : 1)
902 #define NEG(x) (((x) & SIGN) ? 1 : 0)
904 #define SX(v) sign_ext (v, opcode->size)
905 #define ZX(v) zero_ext (v, opcode->size)
910 static char buf[2][6];
916 bp[0] = f & MSP430_FLAG_V ? 'V' : '-';
917 bp[1] = f & MSP430_FLAG_N ? 'N' : '-';
918 bp[2] = f & MSP430_FLAG_Z ? 'Z' : '-';
919 bp[3] = f & MSP430_FLAG_C ? 'C' : '-';
924 /* Random number that won't show up in our usual logic. */
925 #define MAGIC_OVERFLOW 0x55000F
928 do_flags (SIM_DESC sd,
929 MSP430_Opcode_Decoded *opcode,
930 int vnz_val, /* Signed result. */
936 int signbit = 1 << (opcode->size - 1);
938 f &= ~opcode->flags_0;
939 f &= ~opcode->flags_set;
940 f |= opcode->flags_1;
942 if (vnz_val & signbit)
943 new_f |= MSP430_FLAG_N;
944 if (! (vnz_val & ((signbit << 1) - 1)))
945 new_f |= MSP430_FLAG_Z;
946 if (overflow == MAGIC_OVERFLOW)
948 if (vnz_val != SX (vnz_val))
949 new_f |= MSP430_FLAG_V;
953 new_f |= MSP430_FLAG_V;
955 new_f |= MSP430_FLAG_C;
957 new_f = f | (new_f & opcode->flags_set);
959 TRACE_ALU (MSP430_CPU (sd), "FLAGS: %s -> %s", flags2string (SR),
960 flags2string (new_f));
962 TRACE_ALU (MSP430_CPU (sd), "FLAGS: %s", flags2string (new_f));
966 #define FLAGS(vnz,c) do_flags (sd, opcode, vnz, c, MAGIC_OVERFLOW)
967 #define FLAGSV(vnz,c,v) do_flags (sd, opcode, vnz, c, v)
969 /* These two assume unsigned 16-bit (four digit) words.
970 Mask off unwanted bits for byte operations. */
973 bcd_to_binary (int v)
975 int r = ( ((v >> 0) & 0xf) * 1
976 + ((v >> 4) & 0xf) * 10
977 + ((v >> 8) & 0xf) * 100
978 + ((v >> 12) & 0xf) * 1000);
983 binary_to_bcd (int v)
985 int r = ( ((v / 1) % 10) << 0
986 | ((v / 10) % 10) << 4
987 | ((v / 100) % 10) << 8
988 | ((v / 1000) % 10) << 12);
993 cond_string (int cond)
1018 /* Checks a CALL to address CALL_ADDR. If this is a special
1019 syscall address then the call is simulated and non-zero is
1020 returned. Otherwise 0 is returned. */
1023 maybe_perform_syscall (SIM_DESC sd, int call_addr)
1025 if (call_addr == 0x00160)
1029 for (i = 0; i < 16; i++)
1032 fprintf (stderr, "\t");
1033 fprintf (stderr, "R%-2d %05x ", i, MSP430_CPU (sd)->state.regs[i]);
1036 int sp = SP + (3 - (i / 4)) * 2;
1037 unsigned char buf[2];
1039 sim_core_read_buffer (sd, MSP430_CPU (sd), read_map, buf, sp, 2);
1041 fprintf (stderr, "\tSP%+d: %04x", sp - SP,
1042 buf[0] + buf[1] * 256);
1048 fprintf (stderr, flags & 0x100 ? " V" : " -");
1049 fprintf (stderr, flags & 0x004 ? "N" : "-");
1050 fprintf (stderr, flags & 0x002 ? "Z" : "-");
1051 fprintf (stderr, flags & 0x001 ? "C" : "-");
1054 fprintf (stderr, "\n");
1060 if ((call_addr & ~0x3f) == 0x00180)
1063 int syscall_num = call_addr & 0x3f;
1064 int arg1 = MSP430_CPU (sd)->state.regs[12];
1065 int arg2 = MSP430_CPU (sd)->state.regs[13];
1066 int arg3 = MSP430_CPU (sd)->state.regs[14];
1067 int arg4 = MSP430_CPU (sd)->state.regs[15];
1069 MSP430_CPU (sd)->state.regs[12] = sim_syscall (MSP430_CPU (sd),
1070 syscall_num, arg1, arg2,
1079 msp430_step_once (SIM_DESC sd)
1081 Get_Byte_Local_Data ld;
1082 unsigned char buf[100];
1085 unsigned int opcode_pc;
1086 MSP430_Opcode_Decoded opcode_buf;
1087 MSP430_Opcode_Decoded *opcode = &opcode_buf;
1089 int u1, u2, uresult;
1095 int op_bytes, op_bits;
1100 if (opcode_pc < 0x10)
1102 fprintf (stderr, "Fault: PC(%#x) is less than 0x10\n", opcode_pc);
1103 sim_engine_halt (sd, MSP430_CPU (sd), NULL,
1104 MSP430_CPU (sd)->state.regs[0],
1109 if (PC == MSP430_CPU (sd)->state.cio_breakpoint
1110 && STATE_OPEN_KIND (sd) != SIM_OPEN_DEBUG)
1115 opsize = msp430_decode_opcode (MSP430_CPU (sd)->state.regs[0],
1116 opcode, msp430_getbyte, &ld);
1120 fprintf (stderr, "Fault: undecodable opcode at %#x\n", opcode_pc);
1121 sim_engine_halt (sd, MSP430_CPU (sd), NULL,
1122 MSP430_CPU (sd)->state.regs[0],
1127 if (opcode->repeat_reg)
1128 n_repeats = (MSP430_CPU (sd)->state.regs[opcode->repeats] & 0x000f) + 1;
1130 n_repeats = opcode->repeats + 1;
1132 op_bits = opcode->size;
1147 if (TRACE_INSN_P (MSP430_CPU (sd)))
1149 disassemble_info info;
1150 unsigned char b[10];
1152 msp430_trace_one (opcode_pc);
1154 sim_core_read_buffer (sd, MSP430_CPU (sd), 0, b, opcode_pc, opsize);
1156 init_disassemble_info (&info, stderr, (fprintf_ftype) fprintf);
1157 info.application_data = sd;
1158 info.read_memory_func = msp430_dis_read;
1160 fprintf (stderr, "%#8x ", opcode_pc);
1161 for (i = 0; i < opsize; i += 2)
1162 fprintf (stderr, " %02x%02x", b[i+1], b[i]);
1163 for (; i < 6; i += 2)
1164 fprintf (stderr, " ");
1165 fprintf (stderr, " ");
1166 print_insn_msp430 (opcode_pc, &info);
1167 fprintf (stderr, "\n");
1171 if (TRACE_ANY_P (MSP430_CPU (sd)))
1172 trace_prefix (sd, MSP430_CPU (sd), NULL_CIA, opcode_pc,
1173 TRACE_LINENUM_P (MSP430_CPU (sd)), NULL, 0, "");
1181 /* Double-operand instructions. */
1183 if (opcode->n_bytes == 2
1184 && opcode->op[0].type == MSP430_Operand_Register
1185 && opcode->op[0].reg == MSR_CG
1186 && opcode->op[1].type == MSP430_Operand_Immediate
1187 && opcode->op[1].addend == 0
1188 /* A 16-bit write of #0 is a NOP; an 8-bit write is a BRK. */
1189 && opcode->size == 8)
1191 /* This is the designated software breakpoint instruction. */
1193 sim_engine_halt (sd, MSP430_CPU (sd), NULL,
1194 MSP430_CPU (sd)->state.regs[0],
1195 sim_stopped, SIM_SIGTRAP);
1200 /* Otherwise, do the move. */
1201 for (rept = 0; rept < n_repeats; rept ++)
1209 for (rept = 0; rept < n_repeats; rept ++)
1211 carry_to_use = (SR & MSP430_FLAG_C) ? 1 : 0;
1216 uresult = u1 + u2 + carry_to_use;
1217 result = s1 + s2 + carry_to_use;
1218 TRACE_ALU (MSP430_CPU (sd), "ADDC: %#x + %#x + %d = %#x",
1219 u1, u2, carry_to_use, uresult);
1221 FLAGS (result, uresult != ZX (uresult));
1226 for (rept = 0; rept < n_repeats; rept ++)
1234 TRACE_ALU (MSP430_CPU (sd), "ADD: %#x + %#x = %#x",
1237 FLAGS (result, uresult != ZX (uresult));
1242 for (rept = 0; rept < n_repeats; rept ++)
1244 carry_to_use = (SR & MSP430_FLAG_C) ? 1 : 0;
1249 uresult = ZX (~u2) + u1 + carry_to_use;
1250 result = s1 - s2 + (carry_to_use - 1);
1251 TRACE_ALU (MSP430_CPU (sd), "SUBC: %#x - %#x + %d = %#x",
1252 u1, u2, carry_to_use, uresult);
1254 FLAGS (result, uresult != ZX (uresult));
1259 for (rept = 0; rept < n_repeats; rept ++)
1265 uresult = ZX (~u2) + u1 + 1;
1266 result = SX (uresult);
1267 TRACE_ALU (MSP430_CPU (sd), "SUB: %#x - %#x = %#x",
1270 FLAGS (result, uresult != ZX (uresult));
1275 for (rept = 0; rept < n_repeats; rept ++)
1281 uresult = ZX (~u2) + u1 + 1;
1283 TRACE_ALU (MSP430_CPU (sd), "CMP: %#x - %#x = %x",
1285 FLAGS (result, uresult != ZX (uresult));
1290 for (rept = 0; rept < n_repeats; rept ++)
1292 carry_to_use = (SR & MSP430_FLAG_C) ? 1 : 0;
1295 uresult = bcd_to_binary (u1) + bcd_to_binary (u2) + carry_to_use;
1296 result = binary_to_bcd (uresult);
1297 TRACE_ALU (MSP430_CPU (sd), "DADD: %#x + %#x + %d = %#x",
1298 u1, u2, carry_to_use, result);
1300 FLAGS (result, uresult > ((opcode->size == 8) ? 99 : 9999));
1305 for (rept = 0; rept < n_repeats; rept ++)
1310 TRACE_ALU (MSP430_CPU (sd), "AND: %#x & %#x = %#x",
1313 FLAGS (uresult, uresult != 0);
1318 for (rept = 0; rept < n_repeats; rept ++)
1323 TRACE_ALU (MSP430_CPU (sd), "BIT: %#x & %#x -> %#x",
1325 FLAGS (uresult, uresult != 0);
1330 for (rept = 0; rept < n_repeats; rept ++)
1334 uresult = u1 & ~ u2;
1335 TRACE_ALU (MSP430_CPU (sd), "BIC: %#x & ~ %#x = %#x",
1342 for (rept = 0; rept < n_repeats; rept ++)
1347 TRACE_ALU (MSP430_CPU (sd), "BIS: %#x | %#x = %#x",
1354 for (rept = 0; rept < n_repeats; rept ++)
1356 s1 = 1 << (opcode->size - 1);
1360 TRACE_ALU (MSP430_CPU (sd), "XOR: %#x & %#x = %#x",
1363 FLAGSV (uresult, uresult != 0, (u1 & s1) && (u2 & s1));
1367 /* Single-operand instructions. Note: the decoder puts the same
1368 operand in SRC as in DEST, for our convenience. */
1371 for (rept = 0; rept < n_repeats; rept ++)
1374 carry_to_use = u1 & 1;
1376 if (SR & MSP430_FLAG_C)
1377 uresult |= (1 << (opcode->size - 1));
1378 TRACE_ALU (MSP430_CPU (sd), "RRC: %#x >>= %#x",
1381 FLAGS (uresult, carry_to_use);
1386 for (rept = 0; rept < n_repeats; rept ++)
1389 uresult = ((u1 >> 8) & 0x00ff) | ((u1 << 8) & 0xff00);
1390 TRACE_ALU (MSP430_CPU (sd), "SWPB: %#x -> %#x",
1397 for (rept = 0; rept < n_repeats; rept ++)
1401 s1 = 1 << (opcode->size - 1);
1402 uresult = (u1 >> 1) | (u1 & s1);
1403 TRACE_ALU (MSP430_CPU (sd), "RRA: %#x >>= %#x",
1411 for (rept = 0; rept < n_repeats; rept ++)
1415 uresult = (u1 >> 1);
1416 TRACE_ALU (MSP430_CPU (sd), "RRU: %#x >>= %#x",
1424 for (rept = 0; rept < n_repeats; rept ++)
1428 uresult = u1 | 0xfff00;
1430 uresult = u1 & 0x000ff;
1431 TRACE_ALU (MSP430_CPU (sd), "SXT: %#x -> %#x",
1439 for (rept = 0; rept < n_repeats; rept ++)
1443 new_sp = REG_GET (MSR_SP) - op_bytes;
1444 /* SP is always word-aligned. */
1447 REG_PUT (MSR_SP, new_sp);
1449 mem_put_val (sd, SP, u1, op_bits);
1450 if (opcode->op[1].type == MSP430_Operand_Register)
1451 opcode->op[1].reg --;
1456 for (rept = 0; rept < n_repeats; rept ++)
1460 u1 = mem_get_val (sd, SP, op_bits);
1462 if (opcode->op[0].type == MSP430_Operand_Register)
1463 opcode->op[0].reg ++;
1464 new_sp = REG_GET (MSR_SP) + op_bytes;
1465 /* SP is always word-aligned. */
1468 REG_PUT (MSR_SP, new_sp);
1475 if (maybe_perform_syscall (sd, u1))
1478 REG_PUT (MSR_SP, REG_GET (MSR_SP) - op_bytes);
1479 mem_put_val (sd, SP, PC, op_bits);
1480 TRACE_ALU (MSP430_CPU (sd), "CALL: func %#x ret %#x, sp %#x",
1482 REG_PUT (MSR_PC, u1);
1486 u1 = mem_get_val (sd, SP, 16);
1489 PC = mem_get_val (sd, SP, 16);
1491 /* Emulate the RETI action of the 20-bit CPUX architecure.
1492 This is safe for 16-bit CPU architectures as well, since the top
1493 8-bits of SR will have been written to the stack here, and will
1494 have been read as 0. */
1495 PC |= (u1 & 0xF000) << 4;
1496 TRACE_ALU (MSP430_CPU (sd), "RETI: pc %#x sr %#x",
1504 switch (opcode->cond)
1507 u1 = (SR & MSP430_FLAG_Z) ? 0 : 1;
1510 u1 = (SR & MSP430_FLAG_Z) ? 1 : 0;
1513 u1 = (SR & MSP430_FLAG_C) ? 0 : 1;
1516 u1 = (SR & MSP430_FLAG_C) ? 1 : 0;
1519 u1 = (SR & MSP430_FLAG_N) ? 1 : 0;
1522 u1 = (!!(SR & MSP430_FLAG_N) == !!(SR & MSP430_FLAG_V)) ? 1 : 0;
1525 u1 = (!!(SR & MSP430_FLAG_N) == !!(SR & MSP430_FLAG_V)) ? 0 : 1;
1534 TRACE_BRANCH (MSP430_CPU (sd), "J%s: pc %#x -> %#x sr %#x, taken",
1535 cond_string (opcode->cond), PC, i, SR);
1537 if (PC == opcode_pc)
1541 TRACE_BRANCH (MSP430_CPU (sd), "J%s: pc %#x to %#x sr %#x, not taken",
1542 cond_string (opcode->cond), PC, i, SR);
1546 fprintf (stderr, "error: unexpected opcode id %d\n", opcode->id);
1552 sim_engine_run (SIM_DESC sd,
1559 msp430_step_once (sd);
1560 if (sim_events_tick (sd))
1561 sim_events_process (sd);