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

{  I'm sorry that my reply Sounded rude, it wasn't meant as such.  Probably
the best way to make a screen saver TSR is to latch onto inT $8, which is
called once a second to update the clock, using GetIntVec and SetIntVec.
Since your other TSR code is probably a normal Procedure For whatever other
interrupts you are using, just put the screen blanker Procedure inside the
other Procedure, and hopefully when you use Keep Dos will retain both your
normal TSR code and the screen saver code.
}
{$M 4096,0,0}
{$N-,S-}
Program TSRplusSaver;
Uses Dos;

Procedure MyTSR (Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP : Word);
inTERRUPT;
Const Maximum = 120; {2 minutes}
Var Elapsed : Word;
Var Saving  : Boolean;

Procedure ResetSvr (Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP : Word);
Interrupt;
begin
  if Saving then begin
     Saving := False;
     Port[984] := 41;      {Enable 6845 video}
     end;
  Elapsed := 0;
  end;

Procedure MyScreenSaver (Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP : Word);
Interrupt;
begin
  Inc (Elapsed);
  if Elapsed=Maximum then
     Port[984] := 33;      {Disable 6845 video}
     Saving := True;
     end;
  end;

begin {MyTSR}
  MemW[$b800:$0000] := 3585; {Happy face}
  end;

begin
   SetIntVec( $09, @ResetSvr);      {Reset screen saver on Keypress}
   SetIntVec( $08, @MyScreenSaver); {Increment elapsed every second,
                                     activate when ready}
   SetIntVec( $1C, @MyTSR);         {Set up your TSR code}
   Keep(0);
end.

{   I'm pretty sure something like this will work, but I haven't tried it
myself yet.  of course you'll have to add CLI instructions at the
beginning of each of the interrupt Procedure and a restore interrupts after
it, so nothing can occur during them except NMI.  You may have some trouble
there, since on the PCjr the NMI includes keyboard input (pretty stupid,
huh?)
}

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