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

    PROGRAM TestInt28;

    {$M 2048,0,1024}

    USES
      DOS, CRT;

    CONST
      StatBarColor : WORD = $74;

    VAR
      DosIdleVec : PROCEDURE;

    function Time(Hour_12 : Boolean) : String;
    { This function will return a string that contains the time in }
    { a format as follows:  HH:MM:SS am/pm or HH:MM:SS }
    const
      am   = 'am';
      pm   = 'pm';
      zero = '0';
    var
      Hour,
      Minute,
      Second,
      Sec100 : Word;
      Hr,
      Min,
      Sec    : String[2]; { Used in time combining }
    begin
      GetTime(Hour, Minute, Second, Sec100); { Get the system time }
      if Hour <= 12 then
      begin
        Str(Hour, HR);     { Convert Hour to string }
        If Hour = 0 then   { Fix for MIDNIGHT }
          if Hour_12 then
            HR := '12'
          else
            HR := ' 0';
      end
      else
      If Hour_12 then
        Str(Hour - 12, HR)     { Convert Hour to string }
      else
        Str(Hour, HR);
      if Length(Hr) = 1 then   { Fix hour for right time }
        Insert(' ', HR, 1);
      Str(Minute, Min);        { Convert Minute to string }
      if Length(Min) = 1 then
         Min := zero + Min;    { Make Min two char }
      Str(Second, Sec);        { Convert Second to string }
      if Length(Sec) = 1 then
         Sec := zero + Sec;    { Make sec two chars }
      If Hour_12 then          { We want 12 hour time }
        If Hour >= 12 then
          Time := Hr + ':' + Min + ':' + Sec + ' ' + pm
        else
          Time := Hr + ':' + Min + ':' + Sec + ' ' + am
      else                                     { We want 24 hour time }
        Time := Hr + ':' + Min + ':' + Sec;
    end;

    PROCEDURE UpdateTime;
    VAR
      TheTime  : STRING;
      Row, Col : BYTE;
      OldAttr  : WORD;
    BEGIN
      ASM
        mov  ah, 0Fh   { get the active display page.     }
        int  10h
        mov  ah, 03h   { get the cursor position.         }
        int  10h       { DH = ROW, DL = COL               }
        mov  Row, dh
        mov  Col, dl
      END;
      GotoXY(69, 1);
      TheTime  := Time(True);   { GET the time, write the time..   }
      OldAttr  := TextAttr;     { SAVE text color.                 }
      TextAttr := StatBarColor;
      Write(TheTime);
      TextAttr := OldAttr;      { Restore TEXT color....           }
      GotoXY(Col + 1, Row + 1); { add one because BIOS starts at 0 }
    END;

    {$F+}
    PROCEDURE DOSIDLE; INTERRUPT;
    BEGIN
      UpDateTime;
      INLINE($9C);  { push the flags.           }
      DosIdleVec;   { call the old INT routine. }
    END;
    {$F-}

    BEGIN
      CheckBreak := False;           { MAKE SURE USER CANNOT PRESS      }
                                     { CTRL+BREAK TO EXIT.  THE         }
                                     { INTERRUPT WOULD NOT BE RESTORED. }
      GetIntVec($1C, @DOSIdleVec);   { Save old interrupt vector        }
      SetIntVec($1C, Addr(DOSIDLE));

      ClrScr;
      TextAttr := StatBarColor;
      ClrEol;
      Write('TEST PROGRAM FOR hooking timer interrupt, written by Mark Klaamas ²');
      GotoXY(1, 15);
      TextAttr := $07;
      Write('INPUT HERE PLEASE!!!  ');
      ReadLN;

      SetIntVec($1C, Addr(DOSIdleVec));     { restore old interrupt vector.    }
    END.

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