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

{
> I don't know. That's what I'd like to know - how to unload a
> TSR! Ugh. I've been able to program a way to see if it's in
> memory, and modify the current data in it, but nothing more.

Hmmm... Well.... have a look at this code, it is a part from my TSR, I have
marked the procedures that are just for my TSR, and have made a seperate
function in the new interrupt to unload the TSR.  The unload part is written
in July 94 by Luis Mezquita Raya.  It seems to work :)
It is a TSR player for HSC files (by Chicken yep).
}

{$F+}
PROCEDURE New78Int(Flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp:word); Interrupt;
BEGIN
  IF LO(ax) = 00 THEN BEGIN             {Installed?}
    ax := $6676; {BL}
    bx := $7984; {OT}
    IF Active THEN
      cx := $0001                       {Active}
    ELSE
      cx := $0000;                      {Inactive}
    dx := $0115                         {Version & Revision}
  END ELSE
  IF LO(ax) = 01 THEN BEGIN             {Play A File}
    IF Active THEN BEGIN
     FNamePTR := Ptr(bx,cx);
     MOVE(FNamePTR^, Filename, 256);
     IF Play(Filename) THEN
       ax := 00                         {Okay!}
     ELSE ax := 01;                     {Problemo}
    END ELSE
      ax := 01                          {Not Active!}
  END ELSE
  IF LO(ax) = 02 THEN BEGIN             {Quit playing}
     StopPlay;
  END ELSE
  IF LO(ax) = 03 THEN BEGIN             {Set State}
    cx := WORD(Active);                 {Former State Active}
    IF bx = 0 THEN Bossil_Active := FALSE;
    IF bx = 1 THEN Bossil_Active := TRUE;
  END;
  IF LO(ax) = 04 THEN BEGIN
      asm                               {THIS IS THE UNLOAD PROC}
                cli
                mov AH,49h
                mov ES,PrefixSeg
                push ES
                mov ES,ES:[2Ch]
                int 21h
                pop ES
                mov AH,49h
                int 21h
                sti
     end;
END;
END;
{$F-}

BEGIN {MAIN PROGRAM TO ILLUSTRATE CHECKING IF INSTALLED OR NOT}
  GetIntVec($78, Old78hInt);
  IF ((Old78hInt <> NIL) AND (ParamSTR(1) <> stopparam)) THEN BEGIN
    WRITELN('Interrupt Vector 78h Was Already Allocated!');
    HALT(0);
  END ELSE
  IF ((Old78hInt <> nil) AND (ParamSTR(1) = stopparam)) THEN BEGIN
    WRITELN('Desactivated!');
    ASM
      MOV AX,0004h
      INT 78h
    END;
    SetIntVec($78, NIL);
    HALT(0);
  END ELSE
  IF ParamSTR(1) = stopparam THEN BEGIN
    WRITELN('Not installed yet!  Could not desinstall!');
    HALT(0);
  END;
  ASM
    MOV AX,0000h
    INT 78h
    MOV AX, ID1
    MOV BX, ID2
  END;
  IF (ID1 = $6676) AND (ID2 = $7984) THEN BEGIN
    WRITELN('Already installed!  Not reinstalled')
    HALT(0);
  END;
    SetIntVec($78, @New78Int);
  WRITELN('Installed                    (c) 1995, BLoT');
  Active := TRUE;
  Keep(0);
END.
{
I left out the VAR part, but I guess you are smart enough to reconstruct that
one...  Anyway, it seems to work perfectely at my side, so...
}

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