diff options
Diffstat (limited to 'libgloss/m68k/idp-outbyte.c')
-rw-r--r-- | libgloss/m68k/idp-outbyte.c | 38 |
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); +} |