home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9202 / tricks / pascal / alarm.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-01-09  |  4.2 KB  |  167 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      ALARM.PAS                         *)
  3. (*               Speicherresidenter Wecker                *)
  4. (*           (c) 1992 Georg Fischer & DMV-Verlag          *)
  5. (* ------------------------------------------------------ *)
  6. {$M 1024, 0, 0}
  7. {$S-,R-,I-}
  8.  
  9. PROGRAM Alarm;
  10.  
  11. USES Dos, Crt;
  12.  
  13. VAR
  14.   Old_Int1 : PROCEDURE;   (* Alter Timerinterrupt         *)
  15.   Old_Int2 : PROCEDURE;   (* Alter Tastaturinterrupt      *)
  16.   Tick     : LONGINT ABSOLUTE $0040:$006C;
  17.                           (* Anzahl Timer-Ticks           *)
  18.   Zeit     : REAL;        (* Zeit in Sekunden             *)
  19.   Std, Min : LONGINT;
  20.   hh, mm   : LONGINT;
  21.   sek      : LONGINT;
  22.   i        : LONGINT;
  23.   Str0     : STRING[5];   (* Zeit als String [hh:mm]      *)
  24.   st, en   : INTEGER;     (* Anfangs-/Endzeile des Cursor *)
  25.   Res      : INTEGER;
  26.   Std1     : STRING[2];
  27.   Min1     : STRING[2];
  28.   Sek1     : STRING[2];
  29.  
  30.  
  31.   PROCEDURE GetCursor;
  32.   VAR
  33.     Regs : Registers;
  34.   BEGIN
  35.     Regs.AH := 3;
  36.     Regs.BH := 0;
  37.     Intr($10, Regs);
  38.     st := Regs.CH;
  39.     en := Regs.CL;
  40.   END;
  41.  
  42.   PROCEDURE HideCursor;
  43.   VAR
  44.     Regs : Registers;
  45.   BEGIN
  46.     Regs.AH := 1;
  47.     Regs.CX := $2000;
  48.     Intr($10, Regs);
  49.   END;
  50.  
  51.   PROCEDURE ShowCursor;
  52.   VAR
  53.     Regs : Registers;
  54.   BEGIN
  55.     Regs.AH := 1;
  56.     Regs.CH := st;
  57.     Regs.CL := en;
  58.     Intr ($10, Regs);
  59.   END;
  60.  
  61.   PROCEDURE Taste(L, H : BYTE);
  62.   VAR
  63.     i : WORD;
  64.   BEGIN
  65.     i := MemW[$40:$1C];
  66.     Mem[$40:i]   := L;
  67.     Mem[$40:i+1] := H;
  68.     IF (i >= $3C) THEN
  69.       MemW[$40:$1C] := $1E
  70.     ELSE
  71.       INC(MemW[$40:$1C],2);
  72.   END;
  73.  
  74.   PROCEDURE TIME_INT; INTERRUPT;
  75.     (* Holt die Systemzeit und schreibt
  76.        sie auf den Bildschirm *)
  77.   VAR
  78.     x, y    : BYTE;
  79.     OldAttr : BYTE;
  80.   BEGIN
  81.     Zeit := Tick/18.2062;
  82.     Std  := Trunc(Zeit/3600);  Zeit := Zeit-(Std*3600);
  83.     Min  := Trunc(Zeit/60);    Zeit := Zeit-(Min*60);
  84.     Sek  := Trunc(Zeit);
  85.     Str(Std:2, Std1); Str(Min:2, Min1); Str(Sek:2, Sek1);
  86.     IF (Std1[1] = ' ') THEN Std1[1] := '0';
  87.     IF (Min1[1] = ' ') THEN Min1[1] := '0';
  88.     IF (Sek1[1] = ' ') THEN Sek1[1] := '0';
  89.  
  90.     INC(i);
  91.  
  92.     (* FALLS ALARMZEIT GEKOMMEN, TON + UHR *)
  93.  
  94.     IF (i = 6) THEN BEGIN
  95.       x := WhereX;  Y := Wherey;
  96.       GetCursor;
  97.       HideCursor;
  98.       OldAttr := TextAttr;
  99.       GotoXY(65, 1);  TEXTATTR:=31;
  100.       WriteLn(Std1, ':', Min1, ':', Sek1, ' Uhr');
  101.       IF (Std = hh) AND (Min = mm) THEN BEGIN
  102.         Sound(3200); Delay(25); NoSound;
  103.       END ELSE
  104.         Delay(10);
  105.       GotoXY(x, y);
  106.       ShowCursor;
  107.       TextAttr := OldAttr;
  108.     END;
  109.  
  110.     IF (i > 5) THEN i := 0;
  111.  
  112.     INLINE
  113.       ($9C/                  (* PUSHF ; INT 1C AKTIVIE-  *)
  114.        $3E/                  (* DS    ; REN.             *)
  115.        $FF/$1E/OLD_INT1);    (* CALL FAR [OLD_INT1 1C]   *)
  116.   END;
  117.  
  118.   PROCEDURE Tast_Int; INTERRUPT;
  119.     (* Hängt sich in den Tastatur-Interrupt
  120.        und fragt die Zeit ab *)
  121.   BEGIN
  122.  
  123.     (* Falls Hotkey noch nicht betätigt,
  124.        Tastatureingabe über Hotkey *)
  125.     IF ((Mem[$40:$17] AND 14) = 14) AND
  126.         (Mem[$40:$FE] <> 98) THEN BEGIN
  127.       Mem[$40:$FE] := 98;
  128.       Write('Alarmzeit: [hh:mm] '); ReadLn(Str0);
  129.       Val(Copy(Str0,1,2), hh, Res);
  130.       Val(Copy(Str0,4,2), mm, Res);
  131.       Taste(13, 0);
  132.       Mem[$40:$FE] := 0;
  133.       Exit;
  134.     END;
  135.  
  136.     INLINE
  137.       ($9C/                  (* PUSHF ; INT 28h AKTIVIE- *)
  138.        $3E/                  (* DS    ; REN.             *)
  139.        $FF/$1E/OLD_INT2);    (* CALL FAR [OLD_INT2 28]   *)
  140.   END;
  141.  
  142. BEGIN
  143.   CheckBreak := False;
  144.   WriteLn;
  145.   i := 0;
  146.  
  147.   IF (Mem[$40:$FF] = 99) THEN BEGIN
  148.     WriteLn('Programm wurde bereits installiert !');
  149.     Halt(0);
  150.   END ELSE
  151.     Mem[$40:$FF] := 99;
  152.  
  153.   WriteLn('ALARM ist installiert.');
  154.   Write('Alarmzeit: [hh:mm] ');  ReadLn(Str0);
  155.   Val(Copy(Str0, 1, 2), hh, Res);
  156.   Val(Copy(Str0, 4, 2), mm, Res);
  157.  
  158.   GetIntVec($1C, @Old_Int1);
  159.   SetIntVec($1C, @Time_Int);
  160.   GetIntVec($28, @Old_Int2);
  161.   SetIntVEc($28, @Tast_Int);
  162.   Keep(0);
  163. END.
  164. (* ------------------------------------------------------ *)
  165. (*                  Ende von ALARM.PAS                    *)
  166.  
  167.