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

{
 **********************************************
 * CLICK.PAS by Larry Hadley  2-02-1993       *
 * donated to the public domain. if you use   *
 * this code or derive from it, credit would  *
 * be appreciated.                            *
 ********************************************** }

{$S-,N-}
{$M 1024, 0, 0}
Program CLICK;

Uses
  Crt,Dos;

Var
  SavedInt09h,
  SavedInt66h  :Pointer;

Procedure keyClick;
begin
  Sound(50);
  Delay(1);
  NoSound;
end;

Procedure Int09h; interrupt;
begin
  keyClick;           { Sound click everytime called -
                        this is clumsy because key releases as
                        well as keypresses are signalled. Good
                        thing this is For demo only! :-) }
  Asm
    pushf            { push flags to simulate "int" call }
    call SavedInt09h { pass control to original int09 handler -
                       necessary to allow keyboard use. Also
                       demo's chaining of interrupts. }
  end;
end;

Procedure Int66h(AX, BX, CX, DX, SI, DI, DS, ES, BP:Word); interrupt;
Var
  int09new :Pointer;
begin
  if AX<>$FFFF then
    Exit;            { not our call, leave }

  GetIntVec($09, int09new);
  if int09new<>@int09h then
    Exit;            { interrupt vectors have been changed. }

  SetIntVec($09, SavedInt09h); { restore interrupt vectors }
  SetIntVec($66, SavedInt66h);

  MemW[PrefixSeg:$16] := BX; { modify PSP to return to calling }
  MemW[PrefixSeg:$0A] := DI; { Program... }
  MemW[PrefixSeg:$0C] := ES;

  Asm
    mov ah, $50
    mov bx, PrefixSeg
    push ds
    int $21            { set conText }
    pop ds
  end;
  AX := 0;        { tell caller "no error" }
end;

begin   { main - t.s.r. init code }
  GetIntVec($09, SavedInt09h);
  GetIntVec($66, SavedInt66h);

  SetIntVec($09, @Int09h);
  SetIntVec($66, @Int66h);

  Writeln('Click TSR installed.');

  Keep(0);
end.

{************************************************
 * CLICKU.PAS by Larry Hadley  2-02-1993        *
 * CLICK T.S.R. removal Program                 *
 * released into the public domain. if you use  *
 * this code or derive from it, credit would be *
 * appreciated.                                 *
 ************************************************}

{$S-,N-}
Program CLICKU;

Uses
  Dos;

Var
  rtn_seg,
  rtn_ofs  : Word;
  return   : Pointer;

Label int66_error;

Procedure Exit_Label; { ...to provide an address For Dos return to }
begin
  Halt(0);  { I haven't been able to establish For sure that
              this code regains control here. BTW, Brian I have
              code to save DS and restore upon return to this
              Program if you're interested.  This would allow
              using global Variables to save SS:SP. Int 21h func
              $4C destroys DS (and just about everything else)
              on Exit...}
end;

begin
  return := @exit_Label;
  rtn_seg := SEG(return^);
  rtn_ofs := ofS(return^);
  Asm
    mov ax, $FFFF
    mov bx, PrefixSeg
    mov es, rtn_seg
    mov di, rtn_ofs      { pass parms in Registers ax, bx, es, di}
    int $66              { call i.s.r. uninstall Function }
    cmp ax, 0
    jne int66_error      { i.s.r. has returned error }
  end;
  Writeln('Click TSR uninstalled.');
  Asm
    mov ah, $4C
    int $21              { Dos terminate }
  end;

  int66_error:
  Writeln('Error removing TSR.');
  Halt(1);
end.

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