[Back to CURSOR SWAG index] [Back to Main SWAG index] [Original]
Unit cursor;
(*
 *  CURSOR v1.1 - a Unit to provide extended control of cursor shape.
 *
 *  Public Domain 1991 by John Giesbrecht (1:247/128)
 *
 *  Notes:
 *
 *  - This version requires Turbo Pascal 6.0 or later.
 *  - These routines affect only the cursor on page 0.
 *  - This Unit installs an Exit Procedure which restores the cursor
 *    to its original shape when the Programme terminates.
 *)
Interface
Procedure cursoroff;
Procedure cursoron;           (* original cursor shape *)
Procedure blockcursor;
Procedure halfblockcursor;
Procedure linecursor;         (* Default Dos cursor    *)
Procedure setcursor(startline, endline : Byte);
Procedure getcursor(Var startline, endline : Byte);
(********************************************************************)
Implementation
Const
  mono = 7;
Var
  origstartline,
  origendline,
  mode : Byte;
  origexitproc : Pointer;
(********************************************************************)
Procedure setcursor(startline, endline : Byte); Assembler;
Asm
  mov ah, $01
  mov ch, startline
  mov cl, endline
  int $10
end;
(********************************************************************)
Procedure getcursor(Var startline, endline : Byte); Assembler;
Asm
  mov ah, $03
  mov bh, $00
  int $10
  les di, startline
  mov Byte ptr es:[di], ch
  les di, endline
  mov Byte ptr es:[di], cl
end;
(********************************************************************)
Procedure cursoroff;
begin
  setcursor(32, 32);
end;
(********************************************************************)
Procedure cursoron;
begin
  setcursor(origstartline, origendline);
end;
(********************************************************************)
Procedure blockcursor;
begin
  if mode = mono
    then setcursor(1, 12)
    else setcursor(1, 7);
end;
(********************************************************************)
Procedure halfblockcursor;
begin
  if mode = mono
    then setcursor(7, 12)
    else setcursor(4, 7);
end;
(********************************************************************)
Procedure linecursor;
begin
  if mode = mono
    then setcursor(11, 12)
    else setcursor(6, 7);
end;
(********************************************************************)
Procedure restorecursor; Far;
begin
  system.exitproc := origexitproc;
  cursoron;
end;
(**  I N I T I A L I Z A T I O N  ***********************************)
begin
 getcursor(origstartline, origendline);
 Asm
  mov ah, $0F
  int $10
  mov mode, al
 end;
 origexitproc := system.exitproc;
 system.exitproc := addr(restorecursor);
end.
[Back to CURSOR SWAG index] [Back to Main SWAG index] [Original]