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

    { unit to manipulate the text cursor }

    unit Cursor;

    INTERFACE

    TYPE

      PCursorRec = ^TCursorShape;
      TCursorShape = record
        Start : byte;
        Stop  : byte;
      end;

    procedure GetCursorShape (var Shape : TCursorShape);
    { Sets the Start and Stop fields of Shape }

    procedure CursorOff;
    { Turns the cursor off }

    procedure NormCursorOn;
    { Turns underscore cursor on }

    procedure BlockCursorOn;
    { Turns block cursor on }

    procedure SetCursorShape (Shape : TCursorShape);
    { Set cursor shape with Start and Stop fields of Shape }

    IMPLEMENTATION
    VAR
       VideoMode : BYTE ABSOLUTE $0040 : $0049; { Video mode: Mono=7, Color=0-3 }

    procedure GetCursorShape (var Shape : TCursorShape); assembler;
      asm
        mov ah,$03
        mov bx,$00
        int $10
        les di,Shape
        mov TCursorShape (es:[di]).Start,ch    {es:[di] is Start field of Shape}
        mov TCursorShape (es:[di]).Stop,cl  {es:[di+1] is Stop field of Shape}
      end;

    procedure SetCursorShape; assembler;
      asm
        mov ah,$01             { Service 1, set cursor size }
        mov ch,Shape.Start
        mov cl,Shape.Stop
        int $10
      end;

    procedure CursorOff;  assembler;
      asm
        mov ah,$01
        mov ch,$20
        mov cl,$00
        int $10
      end;

    procedure NormCursorOn;
      var
        Shape : TCursorShape;
      begin
        if VideoMode = 7 then
          begin
            Shape.Start := $0A;
            Shape.Stop  := $0B;
          end
        else
          begin
            Shape.Start := $06;
            Shape.Stop  := $07;
          end;
        SetCursorShape (Shape);
      end;

    procedure BlockCursorOn;
      var
        Shape : TCursorShape;
      begin
        if VideoMode = 7 then
          begin
            Shape.Start := $02;
            Shape.Stop  := $0B;
          end
        else
          begin
            Shape.Start := $02;
            Shape.Stop  := $08;
          end;
        SetCursorShape (Shape);
      end;

    END.

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