tty.hh

//*************************************************************************
//  MODULE : TTY - Class definition for a simple teletype emulator        *
//  AUTHOR : Ron Chernich                                                 *
//  PURPOSE: This class used by RCOS to receive and dispatch input from   *
//           the keyboard and display *any* textual output                *
//  HISTORY:                                                              *
//   05-APR-93  Second Implementation following previous flawed design    *
//   08-APR-93  ANSI terminal driver and Error Signals 41, 42 added       *
//   05-FEB-94  "Cursor" changed to "TtyCursor" 'cause of Xlib clash.     *
//*************************************************************************


#ifndef _RCOS_TTY_

  #include 
  #include 
  #include 
  #include 

  #include "rcos.hh"
  #include "message.hh"
  #include "gfx.hh"
  #include "rng.hh"
  #include "obj.hh"
  #include "timer.hh"


  //////////////
  // ASCII defines for characters significamt to the TTY driver
  //
  #define ABEL           7          // ASCII Bell (alert, even)
  #define BKSP           8          // Back space (non-destructive)
  #define ALF           10          // line feed
  #define AFF           12          // form feed clears screen, homes cursor
  #define ACR           13          // carriage return
  #define ESC           27          // Escape lead-in to ANSI control seq.
  #define DEL           127         // last printable char + 1


  ////////////////////
  // attribute bits for mode word .. note that combinations are possible
  //
  #define TTY_Silent    0x0001      // 
  #define TTY_AutoLF    0x0002      // Auto line feed on carriage return
  #define TTY_UseANSI   0x0004      // interperate ANSI escape sequences
  #define TTY_UConly    0x0008      // convert all input to upper case
  #define TTY_Simplex   0x0010      // instant echo of input mode
  #define TTY_Active    0x0020      // update changes to VGA display
  #define TTY_NoWrap    0x0040      // set to prevent wrap-around of display
  #define TTY_Failed    0x0800      // initialisation failed (or worse..)
  #define TTY_CsrMask   0xC000      // Mask for Cursor shapes..
  #define TTY_InvBlk    0x4000      // Inverse video block is default
  #define TTY_IBar      0x8000      // "I" bar cursor
  #define TTY_Uscore    0xC000      // Underscore cursor
  #define TTY_CursorOff 0x0000      // Hide cursor

  #define ON            TRUE        // states for cursor control..
  #define OFF           FALSE       // stored in top 2 bits of mode word


  ///////////////////
  // Like all good RCOS Device Drivers, tty is based on the abstract
  // class  - meaning tty's constructor must invoke port's constructor
  // before it (itself) runs AND we must overload port's pure virtual
  // function "RxPort" for receiving messages from the switcher (Kernel).
  //
  class tty : public port {
    char  *pVmem;                   // array of chars for "Video RAM"
    UINT16 uDest, uCnt;             // who wants 'em and how many they want
    UINT16 nBgnd, nFgnd;            // Background and Foreground colors
    INT16  nEscape;                 // > 0 while processing ANSI sequence
    INT16  n1, n2, ddy;             // Esc seq numerics and top pixel offset
    INT16  xcurr, ycurr;            // current location for output
    INT16  nRows, nCols;            // size of diasplay from x/y pixels
    INT16  x, y, dx, dy;            // origin and size of display area
    INT16  nMode, idx, jdx;         // current mode and index into video RAM
    INT16  AnsiDriver (char);       // interperate ANSI Escape sequences
    void   Reset (BOOL);            // Clear screen and input buffer
    void   Scroll (void);           // do conventional VDU scroll
    void   PutKey (char);           // process a user input key
    void   GetKey (PMSG);           // process a user request for data
    void   TtyCursor (UINT16);      // hide/display cursor
    void   Display (char*, INT16);  // display characters
    Rng    RngBuf;                  // Buffer chars from the "keyboard"
  public:
    tty (UINT16, UINT16, Knl*, rect&, UINT16, UINT16);
    ~tty (void);
    void   RxPort  (PMSG);          // supply virtual member of "port"
    INT16  SetMode (INT16);         // change mode, returning old mode
    void   ReFresh (BOOL = TRUE);   // force a full refresh of the display
    inline INT16 GetMode (void)     // return current terminal mode
      { return nMode; }
  };


  #define _RCOS_TTY_

#endif

/********************************** eof **********************************/