[Back to CURSOR SWAG index] [Back to Main SWAG index] [Original]
{
From: JON JASIUNAS
Subj: Cursor Stuff
Here's a bit of code that will hide / unhide the cursor, without using
assembler: }
uses
  Dos;
var
  R: Registers;
procedure HideCursor;
begin   { HideCursor }
  R.AH := $03;    {- Current cursor status }
  Intr($10, R);
  R.AH := $01;    {- Set cursor }
  R.CH := R.Ch or $20;
  Intr($10, R);
end;    { HideCursor }
procedure ShowCursor;
begin   { ShowCursor }
  R.AH := $03;
  Intr($10, R);
  R.AH := $01;
  R.CH := R.CH and $1F;
  Intr($10, R);
end;    { ShowCursor }
{ However, if you want to use assembler, you can, and you don't need the
  DOS unit.  Here's my Cursor modification unit (in assembler), if you're
  interested. }
{****************************
 *     CURSOR.PAS v1.0      *
 *                          *
 *  General purpose cursor  *
 *  manipulation routines   *
 ****************************
1992-93 - HyperDrive Software
Released into the Public Domain.}
{$S-,R-,D-}
{$IFOPT O+}
  {$F+}
{$ENDIF}
unit Cursor;
{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}
                                   interface
{/////////////////////////////////////////////////////////////////////////////}
const
  csLine  = $01;
  csHalf  = $02;
  csBlock = $03;
procedure DefineCursor(Size: Byte);
procedure GotoXy(X, Y: Byte);
procedure RestoreCursor;
procedure HideCursor;
procedure ShowCursor;
function  CursorHidden: Boolean;
{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}
                                 implementation
{/////////////////////////////////////////////////////////////////////////////}
var
  dcStart, dcEnd: Byte;
{=============================================================================}
procedure DefineCursor(Size: Byte);  ASSEMBLER;
asm     { DefineCursor }
  mov   AH, $0F
  int   $10
  cmp   AL, $07
  jne   @Color
@Mono:
  mov   AH, $03
  int   $10
  cmp   Size, csLine
  je    @MonoL
  cmp   Size, csHalf
  je    @MonoH
  cmp   Size, csBlock
  je    @MonoB
@MonoL:
  mov   CH, $0C
  jmp   @MonoDone
@MonoH:
  mov   CH, $07
  jmp   @MonoDone
@MonoB:
  mov   CH, $00
@MonoDone:
  mov   CL, $0D
  jmp   @Done
@Color:
  mov   AH, $03
  int   $10
  cmp   Size, csLine
  je    @ColorL
  cmp   Size, csHalf
  je    @ColorH
  cmp   Size, csBlock
  je    @ColorB
@ColorL:
  mov   CH, $06
  jmp   @ColorDone
@ColorH:
  mov   CH, $04
  jmp   @ColorDone
@ColorB:
  mov   CH, $00
@ColorDone:
  mov   CL, $07
@Done:
  mov   AH, $01
  int   $10
end;    { DefineCursor }
{-----------------------------------------------------------------------------}
procedure GotoXy(X, Y: Byte);  ASSEMBLER;
asm     { GotoXy }
  mov   AH, $0F
  int   $10
  mov   AH, $02
  dec   Y
  mov   DH, Y
  dec   X
  mov   DL, X
  int   $10
end;    { GotoXy }
{-----------------------------------------------------------------------------}
procedure RestoreCursor;  ASSEMBLER;
asm     { RestoreCursor }
  mov   AH, $01
  mov   CH, dcStart
  mov   CL, dcEnd
  int   $10
end;    { RestoreCursor }
{-----------------------------------------------------------------------------}
procedure HideCursor;  ASSEMBLER;
asm     { HideCursor }
  mov   AH, $03
  int   $10
  mov   AH, $01
  or    CH, $20
  int   $10
end;    { HideCursor }
{-----------------------------------------------------------------------------}
procedure ShowCursor;  ASSEMBLER;
asm     { ShowCursor }
  mov   AH, $03
  int   $10
  mov   AH, $01
  and   CH, $1F
  int   $10
end;    { ShowCursor }
{-----------------------------------------------------------------------------}
function  CursorHidden: Boolean; ASSEMBLER;
asm     { CursorHidden }
  mov   AH, $03
  int   $10
  cmp   CH, $20
  je    @Hidden
  mov   AL, $00
  jmp   @End
@Hidden:
  mov   AL, $01;
@End:
end;    { CursorHidden }
{-----------------------------------------------------------------------------}
                                {** PRIVATE **}
{-----------------------------------------------------------------------------}
procedure SaveCursor;  ASSEMBLER;
asm     { SaveCursor }
  mov   AH, $03
  int   $10
  mov   dcStart, CH
  mov   dcEnd, CL
end;    { SaveCursor }
{=============================================================================}
{$F+}
var
  OldExitProc: Pointer;
procedure NewExitProc;
begin
  ExitProc := OldExitProc;
  RestoreCursor;               {- Restore startup cursor mode }
end;    { NewExitProc }
{$F-}
{=============================================================================}
begin   { Cursor }
  OldExitProc := ExitProc;
  ExitProc    := @NewExitProc;
  SaveCursor;                  {- Save startup cursor mode }
end.    { Cursor }
[Back to CURSOR SWAG index] [Back to Main SWAG index] [Original]