Subject:           Re: Mouse in Pascal
      Date:           Thu, 2 Jul 1998 12:09:51 +0200
      From:           "Mardirossian" 
 Organization:        particulier
 Newsgroups:          borland.public.turbopascal


  (* version limit.*)
{$DEFINE DEBUG}

{$IFDEF DEBUG}
{$I-,D+,L+,Y+,A+,X+,R+,G-}
{$ELSE}
{$I-,D-,L-,Y-,A+,X+,R-,G-}
{$ENDIF}

Uses

  graph,dos,crt;

Const
  cham :
  Array[0..31] Of Word = (
   $83FF, $13FF, $03FF, $E333, $F201, $F200, $F000, $F800,
   $FC00, $FE70, $FEF9, $FEFD, $FEFD, $FEFD, $FEFD, $FDF9,
   $7C00, $EC00, $FC00, $1CCC, $0DFE, $0DFF, $0FFF, $07FF,
   $03FF, $018F, $0106, $0102, $0102, $0102, $0102, $0206);


Type
  ButtonType = (Up, Dn);
  RadioType = (Sel, NotSel);
  OutputType = (c, Pascal, Fortran, Basic);
  TColor = (Black, White, Transp, Invert);
    WBit = 0..15;
    type   mouse = object
     r : registers;
     iposx, iposy : integer;
     isttb : integer;
     present : boolean;
     iaspect : integer;
     procedure pb;
     procedure mouse;
     procedure aspect;
     procedure aspect2;
     function ispresent : boolean;
     function posx : integer;
     function posy : integer;
     function sttb : integer;
     procedure show(status : boolean);
     procedure defwin(minc, minl, maxc, maxl : integer);
                   procedure boutons(interu : integer;
                                     var nb_bout, pos_x, pos_y : integer);
   end;


Const
  Output : OutputType = Pascal;
  Color : TColor = Black;

Const
  OutputName : String = 'CURSOR';
  xmaxvideo:integer=0;
ymaxvideo:integer=0;


Var
   fF                : FILE;
    Mot_Passe        : STRING;
    NPg,N            : WORD;
    Taille_Fichier,
    Taille_EXE       : LONGINT;

  F : Text;
  FullCursor : Array[0..15,0..15] Of TColor;
  Cursor : Array[0..31] Of Word;
   fset : fillsettingstype;
    m : mouse;
    nomfich:string;
  fill : integer;
  colrec : word;
  x,y:integer;
  attr:word;




  procedure  makerectr(x, y, longe, haut, coulav, motif, coulremp :
integer);
  var  c : integer;
  begin
    c := getcolor;
    getfillsettings(fset);
    setfillstyle(motif, coulremp);
    setcolor(coulav);
    bar(x, y, x + longe, y + haut);
    rectangle(x, y, x + longe, y + haut);
    setfillstyle(fset.pattern, fset.color);
    setcolor(c);
  end;

Procedure Button(State : ButtonType; PosX, PosY, Width : Integer;
                 Text : String);
Var
  Len : Integer;
Begin
  Len := Length(Text);
  Case State Of
    Up : Begin
    randomize;
(*           makerectr(posx+2,posy+2,48+len*8,22,7,solidfill,random(254)+1);
9*)
           makerectr(posx+2,posy+2,48+len*8,22,7,solidfill,9);  (*9*)

           setcolor(0);
           line(PosX+2, PosY+22,PosX+48+Len*8, PosY+22);
           line(PosX+2, PosY+2,PosX+2, PosY+22);
           setcolor(15);
           line(PosX+2, PosY+2,PosX+48+Len*8, PosY+2);
           line(PosX+48+len*8, PosY+2,PosX+48+len*8, PosY+22);
           setcolor(3);
           moveto(PosX + 8, PosY + 4);(*10*)
           outtext(Text);
         End;
    Dn : Begin
           makerectr(posx+2,posy+2,48+len*8,22,7,solidfill,9);

           setcolor(15);
           line(PosX+2, PosY+22,PosX+48+Len*8, PosY+22);
           line(PosX+2, PosY+2,PosX+2, PosY+22);
           setcolor(0);
           line(PosX+2, PosY+2,PosX+48+Len*8, PosY+2);
           line(PosX+48+len*8, PosY+2,PosX+48+len*8, PosY+22);
(*           setcolor(8);*)
           moveto(PosX + 9, PosY + 4);(*11*)
           setcolor(3);
           outtext(Text);
         End;
  End;
End;

Procedure RadioButton(State : RadioType; PosX, PosY : Integer;
                      Text : String);
Var
  Len : Integer;
Begin
  Len := Length(Text);
  Case State Of
    Sel : Begin
            setcolor(3);
            moveto(PosX+5,PosY+5);
            circle(posx+5,posy+8,8);
            setcolor(15);
            colrec:=15;
            fill := SOLIDFILL;
            setfillstyle(fill, colrec);
            circle(posx+5,posy+8,4);
            floodfill(posx+5, posy+8, 15);
            moveto(PosX + 17, PosY + 2);
            setcolor(2);
            outtext(Text);
          End;
    NotSel : Begin
               setcolor(3);
               moveto(PosX+5,PosY+5);
               circle(posx+5,posy+8,8);
               setcolor(7);colrec:=7;
               fill := SOLIDFILL;
               setfillstyle(fill, colrec);
               circle(posx+5,posy+8,4);
               floodfill(posx+4, posy+7, 7);
               moveto(PosX + 17, PosY +2);
               setcolor(14);
               outtext(Text);
             End;
  End;
End;
Procedure GroupBox(X,Y,textWidth,textHeight : Integer; Text : String);
Var
  Len : Integer;
Begin
  Len := Length(Text);
  moveto(X,Y);
  setcolor(8);
  setcolor(4);
  rectangle(X+3,Y-4,X+6+Len*8,Y+4);
  setcolor(9);
  moveto(X+6,Y+3);
  outtext(Text);
End;

Procedure DrawGrid;

Begin
  setcolor(8);
  makerectr(160,80,210,196,7,solidfill,7);
  setcolor(8);
  line(352,80,352,272);
  line(340,80,340,272);
  line(328,80,328,272);
  line(316,80,316,272);
  line(304,80,304,272);
  line(292,80,292,272);
  line(280,80,280,272);
  line(268,80,268,272);
  line(256,80,256,272);
  line(244,80,244,272);
  line(232,80,232,272);
  line(220,80,220,272);
  line(208,80,208,272);
  line(196,80,196,272);
  line(184,80,184,272);
  line(172,80,172,272);
  line(160,80,160,272);

  line(160,272,352,272);
  line(160,260,352,260);
  line(160,248,352,248);
  line(160,236,352,236);
  line(160,224,352,224);
  line(160,212,352,212);
  line(160,200,352,200);
  line(160,188,352,188);
  line(160,176,352,176);
  line(160,164,352,164);
  line(160,152,352,152);
  line(160,140,352,140);
  line(160,128,352,128);
  line(160,116,352,116);
  line(160,104,352,104);
  line(160,92,352,92);
  line(160,80,352,80);
End;

Procedure BuildUI;
Begin
    makerectr(0,13,getmaxx,getmaxy-13,7,solidfill,7);

  setcolor(1);
  makerectr(0,0,getmaxx,25,1,solidfill,1);
  setcolor(7);
  makerectr(0,getmaxy-25,getmaxx,getmaxy,1,solidfill,1);
  setcolor(11);
  moveto(6,8);
  outtext('Cursor Editor 1.00');
  moveto(6,462);
  outtext('Source code : ');
  moveto(220,460);
  outtext('CURSOR.CUR');
  setcolor(14);
  moveto(4,6);(*10*)
  outtext('Cursor Editor 1.00');
  moveto(5,460);
  outtext('Source code : ');
  Button(Up,5,60,56,'Save ');
  Button(Up,5,90,56,'Clear');
  Button(Up,5,120,56,'Load ');
  Button(Up,5,150,56,'Exit ');
  RadioButton(Sel,7,330,'Pascal');
  RadioButton(NotSel,7,354,'c');
  RadioButton(NotSel,7,378,'Fortran');
  RadioButton(NotSel,7,402,'Basic');
  RadioButton(Sel,536,330,'Black');
  RadioButton(NotSel,536,354,'White');
  RadioButton(NotSel,536,378,'Transp');
  RadioButton(NotSel,536,402,'Invert');

  DrawGrid;
  m.show(true);
End;

Function HexWord(W : Word) : String;
Const
  Digits : Array[0..$F] Of Char = '0123456789ABCDEF';
Begin
  HexWord[0] := #4;
  HexWord[1] := Digits[Hi(W) Shr 4];
  HexWord[2] := Digits[Hi(W) And $F];
  HexWord[3] := Digits[Lo(W) Shr 4];
  HexWord[4] := Digits[Lo(W) And $F];
End;

Procedure SavePas(s : string);
Var
  I, J, K : Integer;
Begin
  Assign(F, s);
  Rewrite(F);
  For I := 0 To 3 Do
  begin
    For J := 0 To 7 Do
    begin
      K := (I * 8) + J;
      Write(F,'$',HexWord(Cursor[K]),' ');
    end;
    WriteLn(F);
  end;
  Close(F);
End;

Procedure load_cursor(s : string);
Var
  M : word;
  I, J, K, L, num_ligne, tilex, tiley : Integer;
Begin
  Assign(F, s);
  Reset(F);
  For I := 0 To 3 Do
  begin
    For J := 0 To 7 Do
    begin
      K := (I * 8) + J;
      read(F, Cursor[K]);
      if ( i < 2 ) then
      begin
        num_ligne := k;
        for l := 0 to 15 do
        begin
          m := cursor[k] shr l;
          if ( (m mod 2) = 0 ) then
            fullcursor[15 - l, num_ligne] := black;
        end;
      end
      else if ( i >= 2 ) then
      begin
        num_ligne := ((I - 2) * 8) + J;
        for l := 0 to 15 do
        begin
          m := cursor[k] shr l;
          if ( (m mod 2) = 1 ) then
          begin
            if ( fullcursor[15 - l, num_ligne] = black) then
                 fullcursor[15 - l, num_ligne] := white
            else
                 fullcursor[15 - l, num_ligne] := invert;
          end;
        end;
      end;
    end;
    readln(F);
  end;
  Close(F);
  for i := 0 to 15 do
      for j := 0 to 15 do
  begin
    Color := fullcursor[i, j];
    Case Color Of
      Black : setcolor(0);
      White : setcolor(15);
      Transp : setcolor(7);
      Invert : setcolor(3);
    End;
    TileX := i;
    TileY := j;
    rectangle(111+TileX*6,31+TileY*6,115+TileX*6,35+TileY*6);
    putpixel(569+TileX,36+TileY,4);
  end;
End;


Procedure SaveC;
Var
  I : Integer;
Begin
  Assign(F,OutputName + '.C');
  Rewrite(F);
  WriteLn(F);
  Write(F,'short mycursor[] = {');
  For I := 0 To 7 Do
    Write(F,'0x',HexWord(Cursor[I]),',');
  WriteLn(F);
  Write(F,'                    ');
  For I := 8 To 15 Do
    Write(F,'0x',HexWord(Cursor[I]),',');
  WriteLn(F);
  Write(F,'                    ');
  For I := 16 To 23 Do
    Write(F,'0x',HexWord(Cursor[I]),',');
  WriteLn(F);
  Write(F,'                    ');
  For I := 24 To 30 Do
    Write(F,'0x',HexWord(Cursor[I]),',');
  WriteLn(F,'0x',HexWord(Cursor[31]),'};');
  WriteLn(F);
  Close(F);
End;

Procedure SaveFor;
Var
  I : Integer;
Begin
  Assign(F,OutputName + '.FOR');
  Rewrite(F);
  WriteLn(F);
  WriteLn(F,'       INTEGER*2 MYCURSOR(32)');
  WriteLn(F);
  WriteLn(F,'       DATA MYCURSOR /');
  Write(F,'      +   ');
  For I := 0 To 7 Do
    Write(F,'#',HexWord(Cursor[I]),',');
  WriteLn(F);
  Write(F,'      +   ');
  For I := 8 To 15 Do
    Write(F,'#',HexWord(Cursor[I]),',');
  WriteLn(F);
  Write(F,'      +   ');
  For I := 16 To 23 Do
    Write(F,'#',HexWord(Cursor[I]),',');
  WriteLn(F);
  Write(F,'      +   ');
  For I := 24 To 30 Do
    Write(F,'#',HexWord(Cursor[I]),',');
  WriteLn(F,'#',HexWord(Cursor[31]),'/');
  WriteLn(F);
  Close(F);
End;


Procedure load_cursor2(s : string);
Var
  W : word;
  I, J, K, L, num_ligne, tilex, tiley : Integer;
Begin
  m.show(false);
  Assign(F, s);
  Reset(F);
  For I := 0 To 3 Do
  begin
    For J := 0 To 7 Do
    begin
      K := (I * 8) + J;
      read(F, Cursor[K]);
      if ( i < 2 ) then
      begin
        num_ligne := k;
        for l := 0 to 15 do
        begin
          w := cursor[k] shr l;
          if ( (w mod 2) = 0 ) then
            fullcursor[15 - l, num_ligne] := black;
        end;
      end
      else if ( i >= 2 ) then
      begin
        num_ligne := ((I - 2) * 8) + J;
        for l := 0 to 15 do
        begin
          w := cursor[k] shr l;
          if ( (w mod 2) = 1 ) then
          begin
            if ( fullcursor[15 - l, num_ligne] = black) then
                 fullcursor[15 - l, num_ligne] := white
            else
                 fullcursor[15 - l, num_ligne] := invert;
          end;
        end;
      end;
    end;
    readln(F);
  end;
  Close(F);
  for i := 0 to 15 do
      for j := 0 to 15 do
  begin
    Color := fullcursor[i, j];
    Case Color Of
      Black  : begin
                 setcolor(0);
                 colrec := 0;
               end;
      White  : begin
                 setcolor(15);
                 colrec := 15;
               end;
      Transp : begin
                 setcolor(7);
                 colrec := 7;
               end;
      Invert : begin
                 setcolor(3);
                 colrec := 3;
               end;
    End;
    TileX := i;
    TileY := j;
    fill := SOLIDFILL;
    setfillstyle(fill, colrec);
    rectangle(161+TileX*12,81+TileY*12,171+TileX*12,91+TileY*12);
    floodfill(162+TileX*12,82+TileY*12, colrec);
    rectangle(569+tilex,36+tiley,569+tilex,36+tiley);
  end;
  m.aspect;
  m.show(true);
End;

Procedure load_cursor22;
Var
  W : word;
  I, J, K, L, num_ligne, tilex, tiley : Integer;
Begin
  m.show(false);
  For I := 0 To 3 Do
  begin
    For J := 0 To 7 Do
    begin
      K := (I * 8) + J;
      if ( i < 2 ) then
      begin
        num_ligne := k;
        for l := 0 to 15 do
        begin
          w := cham[k] shr l;
          if ( (w mod 2) = 0 ) then
            fullcursor[15 - l, num_ligne] := black;
        end;
      end
      else if ( i >= 2 ) then
      begin
        num_ligne := ((I - 2) * 8) + J;
        for l := 0 to 15 do
        begin
          w := cham[k] shr l;
          if ( (w mod 2) = 1 ) then
          begin
            if ( fullcursor[15 - l, num_ligne] = black) then
                 fullcursor[15 - l, num_ligne] := white
            else
                 fullcursor[15 - l, num_ligne] := invert;
          end;
        end;
      end;
    end;
  end;
  for i := 0 to 15 do
      for j := 0 to 15 do
  begin
    Color := fullcursor[i, j];
    Case Color Of
      Black  : begin
                 setcolor(0);
                 colrec := 0;
               end;
      White  : begin
                 setcolor(15);
                 colrec := 15;
               end;
      Transp : begin
                 setcolor(7);
                 colrec := 7;
               end;
      Invert : begin
                 setcolor(3);
                 colrec := 3;
               end;
    End;
    TileX := i;
    TileY := j;
    fill := SOLIDFILL;
    setfillstyle(fill, colrec);
    rectangle(161+TileX*12,81+TileY*12,171+TileX*12,91+TileY*12);
    floodfill(162+TileX*12,82+TileY*12, colrec);
    rectangle(569+tilex,36+tiley,569+tilex,36+tiley);
  end;
  m.aspect2;
  m.show(true);
End;


Procedure SaveBas;
Var
  I : Integer;
Begin
  Assign(F,OutputName + '.BAS');
  Rewrite(F);
  WriteLn(F);
  WriteLn(F,'DIM MyCursor(32)');
  WriteLn(F);
  WriteLn(F,'Rem MyCursor values');
  Write(F,'DATA ');
  For I := 0 To 7 Do
    Write(F,'&',HexWord(Cursor[I]),',');
  WriteLn(F);
  Write(F,'DATA ');
  For I := 8 To 15 Do
    Write(F,'&',HexWord(Cursor[I]),',');
  WriteLn(F);
  Write(F,'DATA ');
  For I := 16 To 23 Do
    Write(F,'&',HexWord(Cursor[I]),',');
  WriteLn(F);
  Write(F,'DATA ');
  For I := 24 To 30 Do
    Write(F,'&',HexWord(Cursor[I]),',');
  WriteLn(F,'&',HexWord(Cursor[31]));
  WriteLn(F);
  Close(F);
End;


Procedure CalcCursor;

  Procedure SetBitW(Var W : Word; Bit : WBit);Assembler;
  Asm
    Mov Cl, Bit
    Mov BX, 1
    SHL BX, CL
    LES DI, W
    OR ES:[DI], BX
  End;

Var
  I, J : Integer;
Begin
  FillChar(Cursor,SizeOf(Cursor),0);

  For I := 0 To 15 Do
    For J := 0 To 15 Do
      Case FullCursor[I,J] Of
        White : SetBitW(Cursor[J+16],15-I);
        Transp : SetBitW(Cursor[J],15-I);
        Invert : Begin
                   SetBitW(Cursor[J+16],15-I);
                   SetBitW(Cursor[J],15-I);
                 End;
      End;
End;
  procedure  Mouse.pb;
  begin
    r.ax := 3;
    intr($33, r);
    iposx := r.cx;
    iposy := r.dx;
    isttb := r.bx;
  end;



  function  Mouse.ispresent : boolean;
  begin
    ispresent := present;
  end;


  procedure  Mouse.Mouse;
  begin
    r.ax := 0;
    intr($33, r);
    if ( r.ax = 0 ) then
  present := false
    else
  present := true;
  end;


  procedure  Mouse.Aspect;
  var  I, J, K : integer;
       File_cursor : text;
       Cursor : Array[0..31] Of Word;
  begin
    Assign(File_cursor, nomfich);
    Reset(File_cursor);
    For I := 0 To 3 Do
    begin
      For J := 0 To 7 Do
      begin
        K := (I * 8) + J;
        read(File_cursor, Cursor[K]);
      end;
      readln(File_cursor);
    end;
    Close(File_cursor);
    r.ax := 9;
    r.bx := 0;
    r.cx := 0;
    r.es := seg(cursor);
    r.dx := ofs(cursor);
    intr($33, r);
  end;

  procedure  Mouse.Aspect2;
  var  I, J, K : integer;
       File_cursor : text;
       Cursor : Array[0..31] Of Word;
  begin
    For I := 0 To 3 Do
    begin
      For J := 0 To 7 Do
      begin
        K := (I * 8) + J;
      end;
    end;
    r.ax := 9;
    r.bx := 0;
    r.cx := 0;
    r.es := seg(cham);
    r.dx := ofs(cham);
    intr($33, r);
  end;


  function  Mouse.posx : integer;
  begin
    pb;
    posx := iposx;
  end;


  function  Mouse.posy : integer;
  begin
    pb;
    posy := iposy;
  end;


  function  Mouse.sttb : integer;
  begin
    pb;
    sttb := isttb;
  end;


  procedure  Mouse.show(status : boolean);
  begin
    if ( status ) then
    begin
      r.ax := 1;
      intr($33, r);
    end
    else
    begin
      r.ax := 2;
      intr($33, r);
    end;
  end;


  procedure  Mouse.defwin(minc, minl, maxc, maxl : integer);
  begin
    r.ax := 7;
    r.cx := minc;
    r.dx := maxc;
    intr($33, r);
    r.ax := 8;
    r.cx := minl;
    r.dx := maxl;
    intr($33, r);
  end;


  procedure  Mouse.Boutons(interu : integer;
                           var nb_bout, pos_x, pos_y : integer);
  begin
    r.bx := 0;
(*    repeat *)
      r.ax := 5;
      if ( interu = -1 ) then
           r.ax := 6;
      intr($33, r);
(*    until ( r.ax = 1);*)
    nb_bout := r.bx;
    pos_x   := r.cx;
    pos_y   := r.dx;
  end;

    function existfile(nomf:string):boolean;
  var attrb:word;
      fich:file;
  begin
    assign(fich,nomf);
    getfattr(fich,attrb);
    if(doserror<>ioresult)
    then existfile:=false
    else
     if((attrb=volumeid) or (attrb=directory))
     then existfile:=false
  end;



  function  litnomfich : string;
  var  c : char;
       nomfich, save : string[30];
       j, xx, yy, fin, back, ok, eee : integer;
  begin
    j := 1;
    xx:=220;
    yy:=460;
    fin := 0;
    back := 0;
    ok := 0;
    eee := 0;
    nomfich := '';
    repeat
      c := readkey;
      c := upcase(c);
      case ( c ) of
  #8  : if ( j > 1 ) then
        begin
   j := j - 1;
   save := '';
   save := copy(nomfich,1,j-1);
   nomfich := '';
   nomfich := copy(save,1,j-1);
   back := 1;
   ok := 0;
        end;
#13  : begin
   fin := 1;
        end;
#42  : begin
        end;
#63  : begin
        end;
#27  : begin
   fin := 1;
   eee := 1;
        end
else
   if ( j < 25 ) then
   begin
     nomfich := concat(nomfich,c);
     ok := 1;
   end;
end;
      if ( ok = 1) then
      begin
setcolor(11);
outtextxy(xx, yy, c);
xx := xx + textwidth('w');
j := j + 1;
ok := 0;
      end;
      if ( back = 1) then
      begin
c := nomfich[j];
xx := xx - textwidth(c);
setcolor(1);
outtextxy(xx, yy, c);
back := 0;
      end;
    until (fin = 1) ;
    if ( eee = 1) then
    begin
      litnomfich := '';
    end
    else
      litnomfich := nomfich;
  end;


(* procedure egavgadriverproc;external;
{$L EGAVGA.OBJ}
procedure sansseriffontproc;external;
{$L SANS.OBJ}*)

Var
  OldMode : Byte;
  Count, mX, mY : Integer;
  Bt, posx, posy : Integer;
  TileX, TileY : Integer;
  key, aux : Byte;
  Ch : Char;
  S : String;
  I : Integer;
  graphdriver,graphmode:integer;
Begin

  graphdriver:=vga;
  graphmode:=vgahi;
  initgraph(graphdriver,graphmode,'');
  SetTextStyle(0, HorizDir, 2);
  ;

  FillChar(FullCursor,SizeOf(FullCursor),Transp);
  BuildUI;
  m.mouse;
  m.defwin(0, 0, 635, 470);
  m.show(true);
  load_cursor22;
  Color := Black;

  repeat
    m.boutons(-1,Count,posX,posY);
    m.boutons(1,Count,mX,mY);
    If (mX = 0) And (mY = 0) Then Continue;

(*
    ---------------
    Traitement SAVE
    ---------------
*)
    If (mX >= 6) And (mX <= 80) And (mY >= 61) and (my <= 91) Then
    Begin
      m.show(false);
      Button(Dn,5,60,56,'Save ');
      m.show(true);
      Repeat
        m.boutons(-1,Count,mX,mY);
      Until Count > 0;
      If (mX >= 6) And (mX <= 80) And (mY >= 61) and (my <= 91) Then
      Begin
        CalcCursor;
        setcolor(15);
        makerectr(218,460,220,20,1,solidfill,1);
        setcolor(11);
        moveto(220,460);
        S := '';
        S := litnomfich;
        If ( S = '' ) Then
             S := OutputName;
        Case Output Of
          Pascal  : begin
                      S := concat(s, '.CUR');
                      SavePas(s);
                    end;
          c       : begin
                      S := concat(s, '.C');
                      SaveC;
                    end;
          Fortran : begin
                      S := concat(s, '.FOR');
                      SaveFor;
                    end;
          Basic   : begin
                      S := concat(s, '.BAS');
                      SaveBas;
                    end;
        End;
        setcolor(15);
        makerectr(218,460,220,20,1,solidfill,1);
        setcolor(11);
        moveto(220,460);
        outtext(S);
        m.show(false);
        Button(Up,5,60,56,'Save ');
        m.show(true);
        repeat
          mx := m.posx;
          my := m.posy;
        until ( m.sttb = 1 );
      End;
      Continue;
    End;

(*
    ----------------
    Traitement CLEAR
    ----------------
*)
    If (mX >= 6) And (mX <= 80) And (mY >= 76) and (my <= 106) Then
    Begin
      m.show(false);
      Button(Dn,5,90,56,'Clear');
      m.show(true);
      Repeat
        m.boutons(-1,Count,mX,mY);
      Until Count > 0;
      If (mX >= 6) And (mX <= 80) And (mY >= 76) and (my <= 106) Then
      Begin
        FillChar(FullCursor,SizeOf(FullCursor),transp);
        m.show(false);
        DrawGrid;
        setcolor(9);
        makerectr(567,36,33,15,7,solidfill,7);
        m.show(true);
        m.show(false);
        Button(Up,5,90,56,'Clear');
        m.show(true);

        repeat
          mx := m.posx;
          my := m.posy;
        until ( m.sttb = 1 );
      End;
      Continue;
    End;

(*
    ---------------
    Traitement LOAD
    ---------------
*)
    If (mX >= 6) And (mX <= 80) And (mY >= 106) and (my <= 136) Then
    Begin
      m.show(false);
      Button(Dn,5,120,56,'Load ');
      m.show(true);
      If (mX >= 6) And (mX <= 80) And (mY >= 106) and (my <= 136) Then
      Begin
        setcolor(7);
                outtextxy(20,30,'file not found');

        setcolor(15);
        makerectr(218,460,220,20,1,solidfill,1);
        setcolor(11);
        moveto(220,460);
        S := '';
        S := litnomfich;
        If ( S = '' ) Then
             S := OutputName;
        Case Output Of
          Pascal  : S := concat(s, '.CUR');
          c       : S := concat(s, '.C');
          Fortran : S := concat(s, '.FOR');
          Basic   : S := concat(s, '.BAS');
        End;
        setcolor(15);
        makerectr(218,460,220,20,1,solidfill,1);
        setcolor(11);
        moveto(220,460);
        outtext(S);
        m.show(true);
        FillChar(FullCursor,SizeOf(FullCursor),Transp);
        m.show(false);
        DrawGrid;
        setcolor(7);
        rectangle(568,35,585,52);
        m.show(true);
        nomfich := s;
        if existfile(s) then
        load_cursor2(s)
        else begin setcolor(red);
        outtextxy(20,30,'file not found');
        load_cursor22;end;
        m.show(false);
        RadioButton(Sel,536,330,'Black');
        RadioButton(NotSel,536,354,'White');
        RadioButton(NotSel,536,378,'Transp');
        RadioButton(NotSel,536,402,'Invert');
        m.show(true);
        Color := Black;
        colrec:=0;
        CalcCursor;
        m.show(false);
        Button(Up,5,120,56,'Load ');
        m.show(true);

        repeat
          mx := m.posx;
          my := m.posy;
        until ( m.sttb = 1 );
      End;
      Continue;
    End;

(*
    ---------------
    Traitement EXIT
    ---------------
*)
    If (mX >= 6) And (mX <= 80) And (mY >= 140) and (my <= 170) Then
    begin
      Break;
      m.show(false);
      Button(Up,5,150,56,'Exit ');
      m.show(true);
      Continue;
      exit;closegraph;
    End;

(*
    ----------------------------------
    Traitement Choix du langage PASCAL
    ----------------------------------
*)
    If (mX >= 5) And (mX <= 115) And (mY >= 330) and (my <= 340) Then
    Begin
      If Output <> Pascal Then
      Begin
        m.show(false);
        RadioButton(Sel,7,330,'Pascal');
        RadioButton(NotSel,7,354,'c');
        RadioButton(NotSel,7,378,'Fortran');
        RadioButton(NotSel,7,402,'Basic');
        Output := Pascal;
        setcolor(15);
        makerectr(218,460,220,20,1,solidfill,1);
        setcolor(11);
        moveto(220,460);
        outtext(OutputName + '.CUR');
        m.show(true);
        Continue;
      End;
    End;

(*
    -----------------------------
    Traitement Choix du langage C
    -----------------------------
*)
    If (mX >= 5) And (mX <= 115) And (mY >= 354) and (my <= 364) Then
    Begin
      If Output <> c Then
      Begin
        m.show(false);
        RadioButton(NotSel,7,330,'Pascal');
        RadioButton(Sel,7,354,'c');
        RadioButton(NotSel,7,378,'Fortran');
        RadioButton(NotSel,7,402,'Basic');
        Output := c;
        setcolor(15);
        makerectr(218,460,220,20,1,solidfill,1);
        setcolor(11);
        moveto(220,460);
        outtext(OutputName + '.C');
        m.show(true);
        Continue;
      End;
    End;

(*
    -----------------------------------
    Traitement Choix du langage FORTRAN
    -----------------------------------
*)
    If (mX >= 5) And (mX <= 115) And (mY >= 378) and (my <= 388) Then
    Begin
      If Output <> Fortran Then
      Begin
        m.show(false);
        RadioButton(NotSel,7,330,'Pascal');
        RadioButton(NotSel,7,354,'c');
        RadioButton(Sel,7,378,'Fortran');
        RadioButton(NotSel,7,402,'Basic');
        Output := Fortran;
        setcolor(15);
        makerectr(218,460,220,20,1,solidfill,1);
        setcolor(11);
        moveto(220,460);
        outtext(OutputName + '.FOR');
        m.show(true);
        Continue;
      End;
    End;

(*
    ---------------------------------
    Traitement Choix du langage BASIC
    ---------------------------------
*)
    If (mX >= 5) And (mX <= 115) And (mY >= 402) and (my <= 412) Then
    Begin
      If Output <> Basic Then
      Begin
        m.show(false);
        RadioButton(NotSel,7,330,'Pascal');
        RadioButton(NotSel,7,354,'c');
        RadioButton(NotSel,7,378,'Fortran');
        RadioButton(Sel,7,402,'Basic');
        Output := Basic;
        setcolor(15);
        makerectr(218,460,220,20,1,solidfill,1);
        setcolor(11);
        moveto(220,460);
        outtext(OutputName + '.BAS');
        m.show(true);
        Continue;
      End;
    End;

(*
    ------------------------------------
    Traitement Choix de la couleur BLACK
    ------------------------------------
*)
    If (mX >= 536) And (mX <= 628) And (mY >= 330) and (my <= 340) Then
    Begin
      If Color <> Black Then
      Begin
        m.show(false);
        RadioButton(Sel,536,330,'Black');
        RadioButton(NotSel,536,354,'White');
        RadioButton(NotSel,536,378,'Transp');
        RadioButton(NotSel,536,402,'Invert');
        m.show(true);
        Color := Black;
        colrec:=0;
        Continue;
      End;
    End;

(*
    ------------------------------------
    Traitement Choix de la couleur WHITE
    ------------------------------------
*)
    If (mX >= 538) And (mX <= 628) And (mY >= 354) and (my <= 364) Then
    Begin
      If Color <> White Then
      Begin
        m.show(false);
        RadioButton(NotSel,536,330,'Black');
        RadioButton(Sel,536,354,'White');
        RadioButton(NotSel,536,378,'Transp');
        RadioButton(NotSel,536,402,'Invert');
        m.show(true);
        Color := White;
        colrec:=15;
        Continue;
      End;
    End;

(*
    -------------------------------------
    Traitement Choix de la couleur TRANSP
    -------------------------------------
*)
    If (mX >= 538) And (mX <= 628) And (mY >= 378) and (my <= 388) Then
    Begin
      If Color <> Transp Then
      Begin
        m.show(false);
        RadioButton(NotSel,536,330,'Black');
        RadioButton(NotSel,536,354,'White');
        RadioButton(Sel,536,378,'Transp');
        RadioButton(NotSel,536,402,'Invert');
        m.show(true);
        Color := Transp;
        colrec:=7;
        Continue;
      End;
    End;

(*
    -------------------------------------
    Traitement Choix de la couleur INVERT
    -------------------------------------
*)
    If (mX >= 538) And (mX <= 628) And (mY >= 402) and (my <= 412) Then
    Begin
      If Color <> Invert Then
      Begin
        m.show(false);
        RadioButton(NotSel,536,330,'Black');
        RadioButton(NotSel,536,354,'White');
        RadioButton(NotSel,536,378,'Transp');
        RadioButton(Sel,536,402,'Invert');
        m.show(true);
        Color := Invert;
        colrec:=3;
        Continue;
      End;
    End;

(*
    -------------------------------
    Traitement de DESSIN du curseur
    -------------------------------
*)
    If ( (mX >= 160) And (mX <= 356) And
         (mY >= 80) and (my <= 276) ) then
    Begin
      Case Color Of
        Black  : begin
                   setcolor(0);
                   colrec := 0;
                 end;
        White  : begin
                   setcolor(15);
                   colrec := 15;
                 end;
        Transp : begin
                   setcolor(7);
                   colrec := 7;
                 end;
        Invert : begin
                   setcolor(3);
                   colrec := 3;
                 end;
      End;
      posX := 100;
      repeat
        repeat
          mx := m.posx;
          my := m.posy;
        until ( m.sttb = 1 );
        TileX := (mX - 160) Div 12;
        TileY := (mY -  80) Div 12;
        If (TileX >= 0) And (TileX <= 15) And (TileY >= 0) And
           (TileY <= 15) And ((TileX <> posX) Or (TileY <> posY)) then
        Begin
          m.show(false);
          fill := SOLIDFILL;
          setfillstyle(fill, colrec);
          rectangle(161+TileX*12,81+TileY*12,171+TileX*12,91+TileY*12);
          floodfill(162+TileX*12,82+TileY*12, colrec);

          rectangle(569+tilex,36+tiley,569+tilex,36+tiley);
          m.show(true);
          FullCursor[TileX,TileY] := Color;
          posX := TileX;
          posY := TileY;
        End;
        m.boutons(-1,Count,X,Y);
      Until Count > 0;
      Continue;
    End;
  until true = false;closegraph;
End.

This prog. is coming from SWAG, I added my own procedures for the mouse,
and the 2 load procedures, one load is for  constant, the other for a file.
Notice that some procedure are never called !!!!!!!!
If there is error (?),let me know !!!

cut here and save as cham.cur
-----------------------------------------------------------------------------------
$83FF $13FF $03FF $E333 $F201 $F200 $F000 $F800
$FC00 $FE70 $FEF9 $FEFD $FEFD $FEFD $FEFD $FDF9
$7C00 $EC00 $FC00 $1CCC $0DFE $0DFF $0FFF $07FF
$03FF $018F $0106 $0102 $0102 $0102 $0102 $0206
-----------------------------------------------------------------------------------
bye
patrick
marseille


    Source: geocities.com/~franzglaser/tpsrc

               ( geocities.com/~franzglaser)