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

{
{ CURSORUN.PAS }

UNIT cursorUnit;
{
  Hey Guys and Gals! Please don't assume anything about what video
  mode I'm using on my computer! And, thus, don't tangle my
  cursor! This unit provides the =only= proper way to put the cursor
  on and off -- put the code you have been given by other people,
  that sets the cursor to some different, fixed states in order to
  show/hide it, where they all belong: in the Bit Bucket!
}

INTERFACE

type      cursorType = record eLine, sLine: byte end;

var       Cursor: cursorType;
{ since BP can't handle typecasting with macro functions,
  we'll also have use for this one: }
          xCursor: word absolute Cursor;
          oldCursor: word;

function  getCursor: word; inline(
  $B7/0/             { mov bh,0  }
  $B4/3/             { mov ah,3  }
  $CD/$10/           { int 10h   }
  $89/$C8);          { mov ax,cx }
procedure setCursor(C: word); inline(
  $59/               { pop cx    }
  $B4/1/             { mov ah,1  }
  $CD/$10);          { int 10h   }
procedure cursorOn;
procedure cursorOff;
procedure blinkSlow; { those three won't work on EGA/VGA }
procedure blinkFast;
procedure blinkNormal;

IMPLEMENTATION

procedure cursorOn;
begin setCursor(getCursor and not $2000) end;

procedure cursorOff;
begin setCursor(getCursor or $2000) end;

procedure blinkSlow;
begin setCursor(getCursor and not $2000 or $4000) end;

procedure blinkFast;
begin setCursor(getCursor or $6000) end;

procedure blinkNormal;
begin setCursor(getCursor and not $6000) end;

BEGIN { always save old cursor first }
   oldCursor:=getCursor
END.  { of Unit init }


{- And here's a short test program, that'll show you how to use the
   unit cursorUnit -}

program TestCursor; { test of Cursor unit }
{$D-,E-,G+,I-,L-,S-}

uses cursorUnit;

begin
  xCursor:=getCursor;
  with Cursor do begin
    writeln;
    writeln('Present start- and endline of cursor:',sLine:3,eLine:3);
    write  ('Change start to 0 to create block type ');
    sLine:=0;     setCursor(xCursor); readln;
    write  ('Make cursor a thin line ');
    sLine:=eLine; setCursor(xCursor); readln;
    write  ('Turn cursor off preserving present size ');
    cursorOff;    readln;
    write  ('Notice how we get our thin cursor back ');
    cursorOn;     readln;
{ those three won't work properly on EGA/VGA }
   {blinkSlow;    readln;
    blinkFast;    readln;
    blinkNormal;  readln}
  end;
  write('Restore original cursor ');
  setCursor(oldCursor); readln
end.


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