summaryrefslogtreecommitdiffstats
path: root/libgloss/m68k/idp-outbyte.c
diff options
context:
space:
mode:
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);
+}