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

    { Updated KEYBOARD.SWG on January 27, 1994 }

    UNIT NoPause;                {  Unit to disable the pause key                }
                            {  Last Updated  Apr 26/93                      }
                            {  Copyright (C) Greg Estabrooks, 1993          }
    INTERFACE
    {***********************************************************************}
    USES DOS;                       { IMPORT SetIntVec,GetIntVec.           }
    VAR
         OldExit   :POINTER;        {  To hold pointer to old exit proc     }
         OldInt09  :POINTER;        {  To hold old int 9h handler           }

    PROCEDURE ForgetPauses;
    FUNCTION PausePressed :WORD;    { Returns number of times pause was     }
                                    { Since last time ForgetPauses was called.}
    {***********************************************************************}
    IMPLEMENTATION
    VAR
         NumPauses :WORD;           {  To hold number of times pause        }
                                    {  was pressed. Not Directly accessible }
                                    {  by other processes.                  }
    PROCEDURE ForgetPauses; ASSEMBLER;
                           {  Routine to Clear Pause counter variable       }
    ASM
      Mov NumPauses,0               {  Clear Pause Variable                 }
    END;{ForgetPauses}

    FUNCTION PausePressed :WORD; ASSEMBLER;
                          { Function to return number of times pause pressed}
    ASM
      Mov AX,NumPauses              {  Load number of pauses into register  }
    END;{PausePressed}

    PROCEDURE TrapPause; ASSEMBLER;
    ASM
      Push DS
      Push AX
      Push ES
      Mov AX,Seg @Data              {  Allow us to access numpauses.        }
      Mov DS,AX
      Mov AX,$40                    {  Point ES, to bios data area          }
      Mov ES,AX
      Mov AH,ES:[$18]               {  Put keyboard shift flags into AH     }
      And AH,8                      {  Clear all but potential pause flags  }
      Or AH,0                       {  Check for zero                       }
      Jz @NormalKey                 {  If it was zero pause wasn't pressed  }
      Add NumPauses,1               {  Add 1 to number of pauses pressed    }
      Mov AH,ES:[$18]               {  Load Flags again                     }
      And AH,$F7                    {  Clear pause flags                    }
      Mov ES:[$18],AH               {  Load new flags byte back into bios   }
    @NormalKey:
      PushF                         {  Push flags onto stack                }
      Call [OldInt09]               {  Call old Int 9h handler              }
    @Exit:
      Sti                           {  Allow Interrupts                     }
      Pop ES                        {  Restore registers that were used     }
      Pop AX
      Pop DS
      IRet                          {  Return from interrupt                }
    END;{TrapPause}

    {$F+}
    PROCEDURE Restore_Pause;
                           {  Routine to restore int 9  and exit pointers   }
    BEGIN
      SetIntVec(9,OldInt09);        { Restore Int pointer to old pointer    }
      ExitProc := OldExit;          { Restore Exit Pointer                  }
    END;{Restore_Pause}
    {$F-}

    PROCEDURE InitTrap;
                       {  Routine to set Int pointers to TrapPause          }
    BEGIN
      GetIntVec(9,OldInt09);        {  Get pointer to Old Int 9h            }
      SetIntVec(9,@TrapPause);      {  Point Int 9 to TrapPause             }
      OldExit := ExitProc;          {  Save Old Exit Pointer                }
      ExitProc := @Restore_Pause;   {  Set exit Pointer to new exit         }
    END;{InitTrap}

    BEGIN
      InitTrap;                        { Set up New Int 9h Handler             }
    END.{***********************************************************************}
    PROGRAM ShowNoPause;            { Demo of NoPause Unit. Greg Estabrooks.}
    USES CRT,                       { IMPORT Clrscr,KeyPressed,ReadKey.     }
         NoPause;                   { Unit containing Pause routines.       }
    VAR
       Misc :WORD;                  { Holds changing number to show the system}
                                    { is not paused.                        }
    BEGIN
      Clrscr;                       { Clear screen clutter.                 }
      ForgetPauses;                 { Clear the pauses number holder.       }
      Misc := 0;                    { Clear Counter.                        }
      REPEAT                        { Loop Until a key other than Pause is  }
                                    { pressed.                              }
        GOTOXY(1,1);                { Always show info at top corner.       }
        Write(Misc:8,'...  You have pressed pause ',PausePressed:3,' times.');
        INC(Misc);                  { Increase counter to show a change.    }
      UNTIL KeyPressed;
    END.{ShowNoPause};
    {***********************************************************************}

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