{ 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.