summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/pc386/console/outch.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/outch.c284
1 files changed, 284 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/console/outch.c b/c/src/lib/libbsp/i386/pc386/console/outch.c
new file mode 100644
index 0000000000..a7ee806ee4
--- /dev/null
+++ b/c/src/lib/libbsp/i386/pc386/console/outch.c
@@ -0,0 +1,284 @@
+/*-------------------------------------------------------------------------+
+| outch.c v1.1 - PC386 BSP - 1997/08/07
++--------------------------------------------------------------------------+
+| (C) Copyright 1997 -
+| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
+|
+| http://pandora.ist.utl.pt
+|
+| Instituto Superior Tecnico * Lisboa * PORTUGAL
++--------------------------------------------------------------------------+
+| Disclaimer:
+|
+| This file is provided "AS IS" without warranty of any kind, either
+| expressed or implied.
++--------------------------------------------------------------------------+
+| This code is based on:
+| outch.c,v 1.4 1995/12/19 20:07:27 joel Exp - go32 BSP
+| With the following copyright notice:
+| **************************************************************************
+| * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994. *
+| * On-Line Applications Research Corporation (OAR). *
+| * All rights assigned to U.S. Government, 1994. *
+| * *
+| * This material may be reproduced by or for the U.S. Government pursuant *
+| * to the copyright license under the clause at DFARS 252.227-7013. This *
+| * notice must appear in all copies of this file and its derivatives. *
+| **************************************************************************
++--------------------------------------------------------------------------*/
+
+
+#include <bsp.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+/*-------------------------------------------------------------------------+
+| Constants
++--------------------------------------------------------------------------*/
+#define DISPLAY_CELL_COUNT (MAX_ROW * MAX_COL)
+ /* Number of display cells. */
+#define TABSIZE 4 /* Number of spaces for TAB (\t) char. */
+#define WHITE 0x0700 /* White on Black background colour. */
+#define BLANK (WHITE | ' ') /* Blank character. */
+
+
+/*-------------------------------------------------------------------------+
+| Global Variables
++--------------------------------------------------------------------------*/
+static rtems_unsigned16 *videoRam = TVRAM;
+ /* Physical address of start of video text memory. */
+static rtems_unsigned16 *videoRamPtr = TVRAM;
+ /* Pointer for current output position in display. */
+static rtems_unsigned8 videoRows = MAX_ROW; /* Number of rows in display. */
+static rtems_unsigned8 videoCols = MAX_COL; /* Number of columns in display. */
+static rtems_unsigned8 cursRow = 0; /* Current cursor row. */
+static rtems_unsigned8 cursCol = 0; /* Current cursor column. */
+
+
+/*-------------------------------------------------------------------------+
+| Function: setHardwareCursorPos
+| Description: Set hardware video cursor at given offset into video RAM.
+| Global Variables: None.
+| Arguments: videoCursor - Offset into video memory.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static inline void
+setHardwareCursorPos(rtems_unsigned16 videoCursor)
+{
+ outport_byte(GDC_REG_PORT, 0xe);
+ outport_byte(GDC_VAL_PORT, (videoCursor >> 8) & 0xff);
+ outport_byte(GDC_REG_PORT, 0xf);
+ outport_byte(GDC_VAL_PORT, videoCursor & 0xff);
+} /* setHardwareCursorPos */
+
+
+/*-------------------------------------------------------------------------+
+| Function: updateVideoRamPtr
+| Description: Updates value of global variable "videoRamPtr" based on
+| current window's cursor position.
+| Global Variables: videoRamPtr, cursRow, cursCol.
+| Arguments: None.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static inline void
+updateVideoRamPtr(void)
+{
+ videoRamPtr = videoRam + cursRow * videoCols + cursCol;
+} /* updateVideoRamPtr */
+
+
+/*-------------------------------------------------------------------------+
+| Function: scrollUp
+| Description: Scrolls display up n lines.
+| Global Variables: None.
+| Arguments: lines - number of lines to scroll.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static void
+scrollUp(rtems_unsigned8 lines)
+{
+ rtems_unsigned16 blankCount;
+ /* Number of blank display cells on bottom of window. */
+ rtems_unsigned16 *ptrDst, *ptrSrc;
+ /* Source and destination pointers for memory copy operations. */
+
+ if (lines < videoRows) /* Move window's contents up. */
+ {
+ rtems_unsigned16 nonBlankCount;
+ /* Number of non-blank cells on upper part of display (total - blank). */
+
+ blankCount = lines * videoCols;
+ nonBlankCount = DISPLAY_CELL_COUNT - blankCount;
+ ptrSrc = videoRam + blankCount;
+ ptrDst = videoRam;
+
+ while(nonBlankCount--)
+ *ptrDst++ = *ptrSrc++;
+ }
+ else /* Clear the whole display. */
+ {
+ blankCount = DISPLAY_CELL_COUNT;
+ ptrDst = videoRam;
+ }
+
+ /* Fill bottom with blanks. */
+ while (blankCount-- > 0)
+ *ptrDst++ = BLANK;
+} /* scrollUp */
+
+
+/*-------------------------------------------------------------------------+
+| Function: printCHAR
+| Description: Print printable character to display.
+| Global Variables: videoRamPtr, cursRow, cursCol.
+| Arguments: c - character to write to display.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static void
+printCHAR(char c)
+{
+ *videoRamPtr++ = c | WHITE;
+ cursCol++;
+ if (cursCol == videoCols)
+ {
+ cursCol = 0;
+ cursRow++;
+ if (cursRow == videoRows)
+ {
+ cursRow--;
+ scrollUp(1);
+ videoRamPtr -= videoCols;
+ }
+ }
+} /* printCHAR */
+
+
+/*-------------------------------------------------------------------------+
+| Function: printBS
+| Description: Print BS (BackSpace - '\b') character to display.
+| Global Variables: videoRamPtr, cursRow, cursCol.
+| Arguments: None.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static inline void
+printBS(void)
+{
+ /* Move cursor back one cell. */
+ if (cursCol > 0)
+ cursCol--;
+ else if (cursRow > 0)
+ {
+ cursRow--;
+ cursCol = videoCols - 1;
+ }
+ else
+ return;
+
+ /* Write a whitespace. */
+ *(--videoRamPtr) = BLANK;
+} /* printBS */
+
+
+/*-------------------------------------------------------------------------+
+| Function: printHT
+| Description: Print HT (Horizontal Tab - '\t') character to display.
+| Global Variables: cursCol.
+| Arguments: None.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static inline void
+printHT(void)
+{
+ do
+ printCHAR(' ');
+ while (cursCol % TABSIZE);
+} /* printHT */
+
+
+/*-------------------------------------------------------------------------+
+| Function: printLF
+| Description: Print LF (Line Feed - '\n') character to display.
+| Global Variables: cursRow.
+| Arguments: None.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static inline void
+printLF(void)
+{
+ cursRow++;
+ if (cursRow == videoRows)
+ {
+ cursRow--;
+ scrollUp(1);
+ }
+ updateVideoRamPtr();
+} /* printLF */
+
+
+/*-------------------------------------------------------------------------+
+| Function: printCR
+| Description: Print CR (Carriage Return - '\r') to display.
+| Global Variables: cursCol.
+| Arguments: None.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static inline void
+printCR(void)
+{
+ cursCol = 0;
+ updateVideoRamPtr();
+} /* printCR */
+
+
+/*-------------------------------------------------------------------------+
+| Function: consPutc
+| Description: Print a character to display at current position.
+| Global Variables: videoRamPtr, videoRam.
+| Arguments: c - character to write to display.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static void
+consPutc(char c)
+{
+ switch (c)
+ {
+ case '\b': printBS(); break;
+ case '\t': printHT(); break;
+ case '\n': printLF(); break;
+ case '\r': printCR(); break;
+ default: printCHAR(c); break;
+ } /* switch */
+
+ setHardwareCursorPos(videoRamPtr - videoRam);
+ /* At current offset into videoRam */
+} /* consPutc */
+
+
+/*-------------------------------------------------------------------------+
+| Function: _IBMPC_outch
+| Description: Higher level (console) interface to consPutc.
+| Global Variables: None.
+| Arguments: c - character to write to console.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+void
+_IBMPC_outch(char c)
+{
+ consPutc(c);
+} /* _IBMPC_outch */
+
+
+/*-------------------------------------------------------------------------+
+| Function: _IBMPC_initVideo
+| Description: Video system initialization. Hook for any early setup.
+| Global Variables: videoRows.
+| Arguments: None.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+void
+_IBMPC_initVideo(void)
+{
+ scrollUp(videoRows); /* Clear entire screen */
+ setHardwareCursorPos(0); /* Cursor at upper left corner */
+} /* _IBMPC_initVideo */