Metropoli BBS
VIEWER: drivers.pas MODE: TEXT (ASCII)
{*******************************************************}
{                                                       }
{       Turbo Pascal Version 7.0                        }
{       Turbo Vision Unit                               }
{                                                       }
{       Copyright (c) 1992 Borland International        }
{                                                       }
{*******************************************************}

{ Drivers unit has been rewritten completely.           }
{ OS/2 system error handler is used, so SysErrorFunc,   }
{ SystemError,SysColorAttr,SysMonoAttr and SaveInt09    }
{ are not available. MouseIntFlag variable is not       }
{ supported also.                                       }
{ New services are introduced to support keystroke      }
{ macros.                                               }
{$PureInt+}
unit Drivers;

{$X+,I-,S-,P-,Cdecl-}

interface

uses Objects, Use32;

{ ******** EVENT MANAGER ******** }

const

{ Event codes }

  evMouseDown = $0001;
  evMouseUp   = $0002;
  evMouseMove = $0004;
  evMouseAuto = $0008;
  evKeyDown   = $0010;
  evCommand   = $0100;
  evBroadcast = $0200;

{ Event masks }

  evNothing   = $0000;
  evMouse     = $000F;
  evKeyboard  = $0010;
  evMessage   = $FF00;

{ Extended key codes }

  kbEsc       = $011B;  kbAltSpace  = $0200;  kbCtrlIns   = $0400;
  kbShiftIns  = $0500;  kbCtrlDel   = $0600;  kbShiftDel  = $0700;
  kbBack      = $0E08;  kbCtrlBack  = $0E7F;  kbShiftTab  = $0F00;
  kbTab       = $0F09;  kbAltQ      = $1000;  kbAltW      = $1100;
  kbAltE      = $1200;  kbAltR      = $1300;  kbAltT      = $1400;
  kbAltY      = $1500;  kbAltU      = $1600;  kbAltI      = $1700;
  kbAltO      = $1800;  kbAltP      = $1900;  kbCtrlEnter = $1C0A;
  kbEnter     = $1C0D;  kbAltA      = $1E00;  kbAltS      = $1F00;
  kbAltD      = $2000;  kbAltF      = $2100;  kbAltG      = $2200;
  kbAltH      = $2300;  kbAltJ      = $2400;  kbAltK      = $2500;
  kbAltL      = $2600;  kbAltZ      = $2C00;  kbAltX      = $2D00;
  kbAltC      = $2E00;  kbAltV      = $2F00;  kbAltB      = $3000;
  kbAltN      = $3100;  kbAltM      = $3200;  kbF1        = $3B00;
  kbF2        = $3C00;  kbF3        = $3D00;  kbF4        = $3E00;
  kbF5        = $3F00;  kbF6        = $4000;  kbF7        = $4100;
  kbF8        = $4200;  kbF9        = $4300;  kbF10       = $4400;
  kbHome      = $4700;  kbUp        = $4800;  kbPgUp      = $4900;
  kbGrayMinus = $4A2D;  kbLeft      = $4B00;  kbRight     = $4D00;
  kbGrayPlus  = $4E2B;  kbEnd       = $4F00;  kbDown      = $5000;
  kbPgDn      = $5100;  kbIns       = $5200;  kbDel       = $5300;
  kbShiftF1   = $5400;  kbShiftF2   = $5500;  kbShiftF3   = $5600;
  kbShiftF4   = $5700;  kbShiftF5   = $5800;  kbShiftF6   = $5900;
  kbShiftF7   = $5A00;  kbShiftF8   = $5B00;  kbShiftF9   = $5C00;
  kbShiftF10  = $5D00;  kbCtrlF1    = $5E00;  kbCtrlF2    = $5F00;
  kbCtrlF3    = $6000;  kbCtrlF4    = $6100;  kbCtrlF5    = $6200;
  kbCtrlF6    = $6300;  kbCtrlF7    = $6400;  kbCtrlF8    = $6500;
  kbCtrlF9    = $6600;  kbCtrlF10   = $6700;  kbAltF1     = $6800;
  kbAltF2     = $6900;  kbAltF3     = $6A00;  kbAltF4     = $6B00;
  kbAltF5     = $6C00;  kbAltF6     = $6D00;  kbAltF7     = $6E00;
  kbAltF8     = $6F00;  kbAltF9     = $7000;  kbAltF10    = $7100;
  kbCtrlPrtSc = $7200;  kbCtrlLeft  = $7300;  kbCtrlRight = $7400;
  kbCtrlEnd   = $7500;  kbCtrlPgDn  = $7600;  kbCtrlHome  = $7700;
  kbAlt1      = $7800;  kbAlt2      = $7900;  kbAlt3      = $7A00;
  kbAlt4      = $7B00;  kbAlt5      = $7C00;  kbAlt6      = $7D00;
  kbAlt7      = $7E00;  kbAlt8      = $7F00;  kbAlt9      = $8000;
  kbAlt0      = $8100;  kbAltMinus  = $8200;  kbAltEqual  = $8300;
  kbCtrlPgUp  = $8400;  kbAltBack   = $0800;  kbNoKey     = $0000;

{ Additional keyboard codes that Borland forgot to define }

 kbCtrlA      = $1E01;  kbCtrlB     = $3002;  kbCtrlC     = $2E03;
 kbCtrlD      = $2004;  kbCtrlE     = $1205;  kbCtrlF     = $2106;
 kbCtrlG      = $2207;  kbCtrlH     = $2308;  kbCtrlI     = $1709;
 kbCtrlJ      = $240A;  kbCtrlK     = $250B;  kbCtrlL     = $260C;
 kbCtrlM      = $320D;  kbCtrlN     = $310E;  kbCtrlO     = $180F;
 kbCtrlP      = $1910;  kbCtrlQ     = $1011;  kbCtrlR     = $1312;
 kbCtrlS      = $1F13;  kbCtrlT     = $1414;  kbCtrlU     = $1615;
 kbCtrlV      = $2F16;  kbCtrlW     = $1117;  kbCtrlX     = $2D18;
 kbCtrlY      = $1519;  kbCtrlZ     = $2C1A;

{ 101-key AT keyboard }

 kbAltTab     = $A500; kbAltDel     = $A300;  kbAltIns    = $A200;
 kbAltPgDn    = $A100; kbAltDown    = $A000;  kbAltEnd    = $9F00;
 kbAltRight   = $9D00; kbAltLeft    = $9B00;  kbAltPgUp   = $9900;
 kbAltUp      = $9800; kbAltHome    = $9700;  kbCtrlTab   = $9400;
 kbCtrlGreyPlus=$9000; kbCtrlCenter = $8F00;  kbCtrlMinus = $8E00;
 kbCtrlUp     = $8D00; kbAltF12     = $8C00;  kbAltF11    = $8B00;
 kbCtrlF12    = $8A00; kbCtrlF11    = $8900;  kbShiftF12  = $8800;
 kbShiftF11   = $8700; kbF12        = $8600;  kbF11       = $8500;
 kbAltGrayPlus= $4E00; kbCenter     = $4C00;  kbAltGreyAst= $3700;
 kbAltSlash   = $3500; kbAltPeriod  = $3400;  kbAltComma  = $3300;
 kbAltBackSlash=$2B00; kbAltOpQuote = $2900;  kbAltQuote  = $2800;
 kbAltSemicolon=$2700; kbAltRgtBrack= $1B00;  kbAltLftBrack=$1A00;
 kbAltEsc     = $0100; kbCtrlDown   = $9100;

{ Special keys }

kbAltShiftBack = $0900;

{ Keyboard state and shift masks }

  kbRightShift  = $0001;
  kbLeftShift   = $0002;
  kbCtrlShift   = $0004;
  kbAltShift    = $0008;
  kbScrollState = $0010;
  kbNumState    = $0020;
  kbCapsState   = $0040;
  kbInsState    = $0080;

{ Mouse button state masks }

  mbLeftButton  = $01;
  mbRightButton = $02;

type

{ Event record }

  PEvent = ^TEvent;
  TEvent = record
    What: Word;
    case Word of
      evNothing: ();
      evMouse: (
        Buttons: Byte;
        Double: Boolean;
        Where: TPoint);
      evKeyDown: (
        case Integer of
          0: (KeyCode: SmallWord;
              ShiftState: Byte);
          1: (CharCode: Char;
              ScanCode: Byte));
      evMessage: (
        Command: Word;
        case Word of
          0: (InfoPtr: Pointer);
          1: (InfoLong: Longint);
          2: (InfoWord: Word);
          3: (InfoInt: Integer);
          4: (InfoByte: Byte);
          5: (InfoChar: Char));
  end;

  TShiftStateHandler = function(var ShiftState: Byte): Boolean;
  TCtrlBreakAction = procedure;

const

{ Initialized variables }

  ButtonCount: Byte = 0;
  MouseEvents: Boolean = False;
  MouseReverse: Boolean = False;
  DoubleDelay: Word = 8;
  RepeatDelay: Word = 8;
  GetShiftStateHandler: TShiftStateHandler = nil;
  CtrlBreakAction: TCtrlBreakAction = nil;
  KeyDownMask: Word = evKeyDown;
  NonStandardModes = True;

var
  MouseButtons: Byte;
  MouseWhere: TPoint;
  MouseEventMask: SmallWord;
  PrevXcptProc: Pointer;

{ Event manager routines }

procedure InitEvents;
procedure DoneEvents;
{ These procedures are called from BASM code, }
{ so they should not change registers         }
{$SAVES ALL}
procedure ShowMouse;
procedure HideMouse;
procedure UpdateMouseWhere;
{$SAVES ebx,esi,edi}
procedure GetMouseEvent(var Event: TEvent);
procedure GetKeyEvent(var Event: TEvent);
function GetShiftState: Byte;

{ ******** SCREEN MANAGER ******** }

const

{ Screen modes }

  smBW80        = $0002;
  smCO80        = $0003;
  smMono        = $0007;
  smNonStandard = $00FF;
  smFont8x8     = $0100;

const

{ Initialized variables }

  StartupMode: Word = $FFFF;
  CheckSnow: Boolean = False;   { not used }
  TVVioHandle: Word = 0;

var

{ Uninitialized variables }

  ScreenMode: Word;
  ScreenWidth: Byte;
  ScreenHeight: Byte;
  HiResScreen: Boolean;
  ScreenBuffer: Pointer;
  CursorLines: SmallWord;
  ScreenMirror: array[0..16383] of Byte;

{ Screen manager routines }

procedure InitVideo;
procedure DoneVideo;
procedure SetVideoMode(Mode: Word);
procedure ClearScreen;

{ Keyboard }

procedure InitKeyboard;

{ Initialized variables }

const
  CtrlBreakHit: Boolean = False;
  SaveCtrlBreak: Boolean = False;       { not used }
  SysErrActive: Boolean = False;
  FailSysErrors: Boolean = False;       { not used }

{ System error handler routines }

procedure InitSysError;
procedure DoneSysError;

{ ******** UTILITY ROUTINES ******** }

{ Keyboard support routines }

function GetAltChar(KeyCode: Word): Char;
function GetAltCode(Ch: Char): Word;
function GetCtrlChar(KeyCode: Word): Char;
function GetCtrlCode(Ch: Char): Word;
function CtrlToArrow(KeyCode: Word): Word;

{ String routines }

procedure FormatStr(var Result: String; const Format: String; var Params);
procedure PrintStr(const S: String);

{ Buffer move routines }

procedure MoveBuf(var Dest; var Source; Attr: Byte; Count: Word);
procedure MoveChar(var Dest; C: Char; Attr: Byte; Count: Word);
procedure MoveCStr(var Dest; const Str: String; Attrs: Word);
procedure MoveStr(var Dest; const Str: String; Attr: Byte);
function CStrLen(const S: String): Integer;

implementation

uses Dos, Os2Def, Os2Base;

begin
end.
[ RETURN TO DIRECTORY ]