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

{To make all cursor routines complete, here are the ones I use: }

procedure setcursorshape(shape : word); assembler; asm
  mov ah,1; mov cx,shape; int 10h; end;

procedure linecursor;
begin
  case Rows of
    25 : case VidCard of
           cga,ega : setcursorshape(256*6+7);
           mda : setcursorshape(256*$b+$c);
           vga : setcursorshape(256*$d+$e);
         else setcursorshape(256*6+7);
         end;
    40 : setcursorshape(256*8+9);
  else setcursorshape(256*6+7);
  end;
end;

procedure halfcursor;
begin
  case Rows of
    25 : case VidCard of
           cga,ega : setcursorshape(256*3+7);
           mda : setcursorshape(256*6+$c);
           vga : setcursorshape(256*7+$e);
         else setcursorshape(256*3+7);
         end;
    40 : setcursorshape(256*4+9);
  else setcursorshape(256*3+7);
  end;
end;

procedure blockcursor; begin
  setcursorshape($10); end;

procedure cursoron; assembler; asm
  mov ah,3; mov bh,0; int 10h; and ch,not 20h; mov ah,1; int 10h; end;

procedure cursoroff; assembler; asm
  mov ah,3; mov bh,0; int 10h; or ch,20h; mov ah,1; int 10h; end;

function getcursorshape : word; assembler; asm
  mov ah,3; mov bh,0; int 10h; mov ax,cx; end;

>--- cut here 

The carddetectionroutines are as follows:

>--- cut here 

const
  mda = 0;                                                     { MDA and HGC }
  cga = 1;
  ega = 2;
  ega_mono = 3;                                        { EGA and MDA-Monitor }
  vga = 4;
  vga_mono = 5;                                           { VGA and VGA-Mono }
  mcga = 6;
  mcga_mono = 7;                                        { MCGA and MCGA-Mono }

var
  VidCard : byte;                                { Code for active videocard }

procedure VideoInit;

const
  VidMode : array[0..11] of byte = (mda,cga,0,ega,ega_mono,0,vga_mono,
                                    vga,0,mcga,mcga_mono,mcga);
  EgaMode : array[0..2] of byte = (ega,ega,ega_mono);

var
  Regs : registers;                           { Processorregisters for int's }

begin
  VidCard := $ff;                                { No videocard detected yet }

  { --- Check card-type ---------------------------------------------------- }

  Regs.ax := $1a00;                                 { Call BIOS function 1Ah }
  intr($10,Regs);
  if Regs.al = $1a then begin                           { VGA of MCGA? - Yes }
    VidCard := VidMode[Regs.bl-1];                      { Get cod from table }
    Color := not ((VidCard = mda) or (VidCard = ega_mono));
  end
  else begin                               { No VGA or MCGA, search EGA-card }
    Regs.ah := $12;                           { Function 12h subfunction 10h }
    Regs.bl := $10;
    intr($10,Regs);                                        { Call Video-BIOS }
    if Regs.bl <> $10 then begin                                { EGA? - Yes }
      VidCard := EgaMode[(Regs.cl shr 1) div 3];                  { Get Code }
      Color := VidCard <> ega_mono;
    end;
  end;

  { --- Define pointer to video-RAM ---------------------------------------- }

  Regs.ah := 15;                                  { Define actual video-mode }
  intr($10,Regs);                                { Call BIOS video-interrupt }
  if Regs.al = 7 then v_vidseg := $b000                   { Monochrome mode? }
  else v_vidseg := $b800;                                    { No, Colormode }

  if VidCard = $ff then begin                   { No EGA, VGA or MCGA? - Yes }
    if Regs.al = 7 then VidCard := mda else VidCard := cga;
    Color := not ((Regs.al = 0) or (Regs.al = 2) or (Regs.al = 7));
    SnowProtect := true;
  end;

  Regs.ah := 5;                                   { Chose actual screen page }
  Regs.al := 0;                                                  { Page zero }
  intr($10,Regs);                                { Call BIOS video-interrupt }
end;

>--- cut here 

This might not compile straight off, but I guess you can imagine what's
possibly missing. ;-) (like 'uses dos')

If everything works, you can easily define your cursor with statements as:

linecursor,
blockcursor,
cursoroff,
cursoron,
etc...

Should work on every possible videocard.

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