[Back to ANSI SWAG index]  [Back to Main SWAG index]  [Original]

{--------------------------------------------------------------------}
(*                                                                  *)
(*         Gansi.Pas -- A Pascal unit containing all of             *)
(*         ANSI graphics, cursor, keyboard, and screen              *)
(*         mode manipulation strings.                               *)
(*                                                                  *)
(*         Version 2.21   April 26th, 1991                          *)
(*                                                                  *)
(*                                   Greg Smith                     *)
(*                                   Boulder, Co. USA               *)
(*                                                                  *)
{--------------------------------------------------------------------}

unit gansi;

interface

uses
  Dos;

type
  ansicode   = string[12]; { Maximum size for most ANSI strings }

const
  hdr        = #27+'['; { ansi control sequence }
  clsd       = hdr+'0J'; { Clear Everything below cursor }
  clsu       = hdr+'1J'; { Clear Everything above cursor }
  cls        = hdr+'2J'; { Clear Screen }
  requestpos = hdr+'6n'; { request Cursor pos. StdIn rets Esc[y;xR }
  delline    = hdr+'K'; { delete from cursor to EOL }
  savepos    = hdr+'s'; { save cursor position }
  restpos    = hdr+'u'; { restore cursor position }
  cursorhome = hdr+'H'; { Home cursor }
  normcolor  = hdr+'0m'; { Normal white on black }
  highlight  = hdr+'1m'; { Highlight.  (Bold) }
  RevVideo   = hdr+'7m'; { Reverse the FG and BG }


function SetPos(x,y:integer): ansicode;
function CursorUp(n:integer): ansicode;
function CursorDown(n:integer): ansicode;
function CursorRight(n:integer): ansicode;
function CursorLeft(n:integer): ansicode;

function InsertChar(n:integer): ansicode;
function DeleteChar(n:integer): ansicode;
function InsertLine(n:integer): ansicode;
function DeleteLine(n:integer): ansicode;

function SetAttr(C:integer): ansicode;
function SetColor(f,b:integer): ansicode;

function SetMode(mode:integer): ansicode;
function Resetmode(mode:integer): ansicode;

function SetChar(ch:char;st:string): string;
function SetExtendedKey(key:integer;st:string): string;


implementation

type  intstring = string[6];

{ Misc support functions }

function bts(x:integer): intstring;
var
  z : intstring;
begin
  Str(x,z);
  bts := z;
end;

function HNum(n:integer): ansicode;
var
  z : intstring;
begin
  Str(n,z);
  HNum := hdr+z;
end;

{ Cursor Control functions }

function SetPos(x,y:integer): ansicode;
begin
  SetPos := hnum(y)+';'+bts(x)+'H';
end;

function CursorUp(n:integer): ansicode;
begin
  CursorUp := hnum(n)+'A';
end;

function CursorDown(n:integer): ansicode;
begin
  CursorDown := hnum(n)+'B';
end;

function CursorRight(n:integer): ansicode;
begin
  CursorRight := hnum(n)+'C';
end;

function CursorLeft(n:integer): ansicode;
begin
  CursorLeft := hnum(n)+'D';
end;


{ Editing Functions }

function InsertChar(n:integer): ansicode;
begin
  InsertChar := hnum(n)+'@';
end;

function DeleteChar(n:integer): ansicode;
begin
  DeleteChar := hnum(n)+'P';
end;

function InsertLine(n:integer): ansicode;
begin
  InsertLine := hnum(n)+'L';
end;

function DeleteLine(n:integer): ansicode;
begin
  DeleteLine := hnum(n)+'M';
end;


{ Color functions }

function SetAttr(C:integer): ansicode;
var
  x : integer;
  tmp : ansicode;

  procedure ColorIdentify;
  begin
    case x of
     0 :  tmp := tmp+'0';  { Black }
     1 :  tmp := tmp+'4';  { Blue }
     2 :  tmp := tmp+'2';  { Green }
     3 :  tmp := tmp+'6';  { Cyan }
     4 :  tmp := tmp+'1';  { Red }
     5 :  tmp := tmp+'5';  { Magenta }
     6 :  tmp := tmp+'3';  { Brown/Yellow }
     7 :  tmp := tmp+'7';  { White }
    end; { case }
  end; { ColorIdentify }

begin
  tmp := hdr;
  if (c and $08)=1 then tmp := tmp+'1' else tmp := tmp+'0';
  tmp := tmp+';3'; { common to all fgnds. }
  x := c and $07; { first three bits. }
  ColorIdentify; { Add Color Value digit }
  tmp := tmp+';4'; { common to all bkgnds. }
  x := (c and $70) shr 4;
  ColorIdentify; { Add color value digit }
  if (c and $80)=$80 then tmp := tmp+';5';
  SetAttr := tmp+'m'; { complete ANSI code! }
end; { setattr }

function SetColor(f,b:integer): ansicode;
begin
  b := (b shl 4); { move to high bits. }
  f := (f and $0f); { zero all high bits. }
  SetColor := SetAttr((b OR f)); {Create Attribute byte from values.}
end; { SetColor }


{ Mode Setting Functions }

function SetMode(mode:integer): ansicode;
begin
  SetMode := hdr+'='+bts(mode)+'h';
  { Modes:
       0     40x25   Black and White
       1     40x25   Color
       2     80x25   Black and White
       3     80x25   Color
       4     320x200 color           (CGA)
       5     320x200 Black and White (CGA)
       6     640x200 Black and White (CGA)
       7     Wrap at end of line.
  }
end;

function Resetmode(mode:integer): ansicode;
begin
  Resetmode := hdr+'='+bts(mode)+'l';  { Same modes as above }
end;                                   { Wrap at EOL will turn off }

{ Keyboard Re-Defining functions }

function SetChar(ch:char;st:string): string;
begin
  SetChar := hdr+bts(ord(ch))+';"'+st+'"p'; { when ch is pressed st is }
end;                                        { sent instead of ch       }

function SetExtendedKey(key:integer;st:string): string;
begin
  SetExtendedKey := hdr+'0;'+bts(key)+';"'+st+'"p'; { Same as above. but the }
end;                                                { Key is an extended code }


end.

[Back to ANSI SWAG index]  [Back to Main SWAG index]  [Original]