From e012af1778a6f78bcb6cda663d31ba2c833de9cb Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 7 Sep 2023 20:20:00 -0700 Subject: [PATCH] MSP430Core: Support "semihosting" Provide exit, putchar, a message writing function and a register dump call. These all work by detecting writes to the status register which are invalid. Signed-off-by: Keith Packard --- se/sics/mspsim/core/MSP430Core.java | 42 ++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index eedf015..641de2a 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -456,10 +456,50 @@ public class MSP430Core extends Chip implements MSP430Constants { * Yet, this has been observed at least once with msp430-gcc 4.6.3. */ System.out.println("Warning: tried to write odd PC, not allowed! PC=0x" + Integer.toHexString(value)); value -= 1; - } + } /* SR can never take values above 0xfff */ if (r == SR) { + + /* semihosting by trapping and ignoring writes to SR */ + + /* exit (0xf000) */ + if (value == 0xf000) { + int code = reg[15]; + System.exit(code); + } + + /* putchar (0xf001) */ + if (value == 0xf001) { + int data = reg[12]; + System.out.print((char) data); + return; + } + + /* message and value (char *, int) (0xf002) */ + if (value == 0xf002) { + int message = reg[12]; + int data = reg[13]; + char c; + System.out.printf("0x%x 0x%x: ", reg[0], message); + try { + int off; + for (off = 0; off < 20 && (c = (char) currentSegment.read(message + off, AccessMode.BYTE, AccessType.READ)) != 0; off++) + System.out.print(c); + } catch(Exception e) { + System.out.printf("Bad message at 0x%x", reg[13]); + } + System.out.printf(" 0x%x %d\n", data, data); + return; + } + + /* dump registers (0xf003) */ + if (value == 0xf003) { + for (int rn = 0; rn < 15; rn++) + System.out.printf("R%02d: 0x%05x ", rn, reg[rn]); + System.out.printf("\n"); + return; + } value &= 0xfff; }