{ GLEN WILSON } {$m 2000,0,0} (* Stops Pascal using all of memory *) {$R-,s-,v-,b-,n-,l+} (* Nothing important, helps keep the size down*) Program screensaver; (* Only blanks screen on CGA/Mono not VGA/etc*) Uses Dos, Crt; Const TimerInt = $08; {Timer Interrupt} KbdInt = $09; {Keyboard Interrupt} Timerlimit : Word = 5460; {5 minute Delay} Var Regs : Registers; Cnt : Word; PortNum : Word; PortOff : Word; Porton : Word; OldKBDVEC : Pointer; OldTimerVec : Pointer; i : Real; code : Real; Procedure STI; Inline($FB); Procedure CLI; Inline($FA); Procedure CallOldInt(Sub : Pointer); (* Primitive way of calling Old Interrupt, never the less, you can see what is happening! *) begin Inline($9c/ { PushF } $FF/$5e/$06); { Call DWord PTR [BP+6] } end; Procedure Keyboard(flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP : Word); Interrupt; begin CallOldInt(OldKbdVec); if (CNT >= Timerlimit) then port[portnum] := porton; Cnt := 0; STI; end; Procedure Clock(flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP : Word); Interrupt; begin CallOldInt(OldTimerVec); if (CNT > Timerlimit) then Port[portnum] := portoff else Inc(Cnt); STI; end; begin Regs.AH := $0F; INTR($10, regs); (* determine Type of video adapter (Mono or Cga) *) if Regs.AL= 7 then begin Portnum := $3b8; Portoff := $21; PortOn := $2d; end else begin Portnum:=$3d8; Portoff:=$25; porton :=$2d; end; (* Save original Procedures *) GetIntVec(KbdInt, OldKbdVEc); GetIntVec(TimerInt, OldTimerVec); (* Install new Interrupts *) SetIntVec(timerint, @clock); SetIntVec(KbdInt, @Keyboard); Cnt := 0; (* Initialize counter *) Keep(0); (* Tell Pascal to keep us in memory *) end. { it seems rather complex but most of that crap is For turning on and off the screen. if you don't have a CGA or MONO you can replace the Port crap With Writeln statements so you can see whats hapening. BTW This is an example from a Programming book ( can't remember what it is called ) becareful, It might be covered by Copy right laws. }