summaryrefslogtreecommitdiffstats
path: root/libgloss/m68k/idp-outbyte.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@codesourcery.com>2001-09-10 23:47:42 +0000
committerJim Blandy <jimb@codesourcery.com>2001-09-10 23:47:42 +0000
commitc4b7e16dd99c068b307da9115497df5dd8b7fb9a (patch)
tree0ced3a627a1c38439a673c7d3c669da26622898c /libgloss/m68k/idp-outbyte.c
parentbb36822663aeb8e82a3c0c6dd7aa0ad287b6fb65 (diff)
downloadcygnal-c4b7e16dd99c068b307da9115497df5dd8b7fb9a.tar.gz
cygnal-c4b7e16dd99c068b307da9115497df5dd8b7fb9a.tar.bz2
cygnal-c4b7e16dd99c068b307da9115497df5dd8b7fb9a.zip
Add support for GDB monitor-style I/O.
* m68k/idp-outbyte.c (raw_outbyte): Renamed from outbyte; made static. (outbyte): Call raw_outbyte; if GDB_MONITOR_OUTPUT is #defined, precede the byte with a ^O character. * m68k/idpgdb.ld: New linker script. * m68k/Makefile.in (IDPGDB_LDFLAGS, IDPGDB_BSP, IDPGDB_OBJS): New variables. (all): Add ${IDPGDB_BSP} to the list of things to build. (${IDPGDB_BSP}, idp-gdb-outbyte.o, idpgdb-test.x, idpgdb-test.srec, idpgdb-test.dis, idpgdb-test): New rules. (install): Install the IDPGDB stuff, too.
Diffstat (limited to 'libgloss/m68k/idp-outbyte.c')
-rw-r--r--libgloss/m68k/idp-outbyte.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/libgloss/m68k/idp-outbyte.c b/libgloss/m68k/idp-outbyte.c
index d09ae89cd..a95dc0c53 100644
--- a/libgloss/m68k/idp-outbyte.c
+++ b/libgloss/m68k/idp-outbyte.c
@@ -28,15 +28,47 @@
#define WRITEREG(x, y) (*((char *) DUART_ADDR + (x * 4) + 3) = y)
/*
- * outbyte -- send a byte to the DUART buffer. This only sends
+ * raw_outbyte -- send a byte to the DUART buffer. This only sends
* to channel A.
*/
-void
-_DEFUN (outbyte, (byte),
+static void
+_DEFUN (raw_outbyte, (byte),
char byte)
{
+ /* First, wait for the UART to finish clocking out the last
+ character we sent, if any. Then, give it the next character to
+ work on. By waiting first, then handing off a new character, we
+ allow the UART to work while the processor (perhaps) does other
+ things; if we waited after sending each character, there'd be no
+ opportunity for parallelism. */
while ((READREG (DUART_SRA) & 0x04) == 0x00)
;
WRITEREG (DUART_TBA, byte); /* write the byte */
}
+
+
+/*
+ * outbyte -- send BYTE out the DUART's channel A, for display to
+ * the user.
+ *
+ * Normally, this is identical to raw_outbyte, but if
+ * GDB_MONITOR_OUTPUT is #defined, we prefix each byte we send
+ * with a ^O character (ASCII 15). This is a signal to GDB's
+ * `rom68k' target to pass the character directly on to the user;
+ * it allows programs to do console output under GDB.
+ *
+ * We compile this file twice: once with GDB_MONITOR_OUTPUT
+ * #defined, and once without. The former .o file we put in
+ * libidpgdb.a, which is included in the link by idpgdb.ld; the
+ * latter we put in libidp.a, which is selected by idp.ld.
+ */
+void
+_DEFUN (outbyte, (byte),
+ char byte)
+{
+#ifdef GDB_MONITOR_OUTPUT
+ raw_outbyte (0x0f);
+#endif
+ raw_outbyte (byte);
+}