home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* ALARM.PAS *)
- (* Speicherresidenter Wecker *)
- (* (c) 1992 Georg Fischer & DMV-Verlag *)
- (* ------------------------------------------------------ *)
- {$M 1024, 0, 0}
- {$S-,R-,I-}
-
- PROGRAM Alarm;
-
- USES Dos, Crt;
-
- VAR
- Old_Int1 : PROCEDURE; (* Alter Timerinterrupt *)
- Old_Int2 : PROCEDURE; (* Alter Tastaturinterrupt *)
- Tick : LONGINT ABSOLUTE $0040:$006C;
- (* Anzahl Timer-Ticks *)
- Zeit : REAL; (* Zeit in Sekunden *)
- Std, Min : LONGINT;
- hh, mm : LONGINT;
- sek : LONGINT;
- i : LONGINT;
- Str0 : STRING[5]; (* Zeit als String [hh:mm] *)
- st, en : INTEGER; (* Anfangs-/Endzeile des Cursor *)
- Res : INTEGER;
- Std1 : STRING[2];
- Min1 : STRING[2];
- Sek1 : STRING[2];
-
-
- PROCEDURE GetCursor;
- VAR
- Regs : Registers;
- BEGIN
- Regs.AH := 3;
- Regs.BH := 0;
- Intr($10, Regs);
- st := Regs.CH;
- en := Regs.CL;
- END;
-
- PROCEDURE HideCursor;
- VAR
- Regs : Registers;
- BEGIN
- Regs.AH := 1;
- Regs.CX := $2000;
- Intr($10, Regs);
- END;
-
- PROCEDURE ShowCursor;
- VAR
- Regs : Registers;
- BEGIN
- Regs.AH := 1;
- Regs.CH := st;
- Regs.CL := en;
- Intr ($10, Regs);
- END;
-
- PROCEDURE Taste(L, H : BYTE);
- VAR
- i : WORD;
- BEGIN
- i := MemW[$40:$1C];
- Mem[$40:i] := L;
- Mem[$40:i+1] := H;
- IF (i >= $3C) THEN
- MemW[$40:$1C] := $1E
- ELSE
- INC(MemW[$40:$1C],2);
- END;
-
- PROCEDURE TIME_INT; INTERRUPT;
- (* Holt die Systemzeit und schreibt
- sie auf den Bildschirm *)
- VAR
- x, y : BYTE;
- OldAttr : BYTE;
- BEGIN
- Zeit := Tick/18.2062;
- Std := Trunc(Zeit/3600); Zeit := Zeit-(Std*3600);
- Min := Trunc(Zeit/60); Zeit := Zeit-(Min*60);
- Sek := Trunc(Zeit);
- Str(Std:2, Std1); Str(Min:2, Min1); Str(Sek:2, Sek1);
- IF (Std1[1] = ' ') THEN Std1[1] := '0';
- IF (Min1[1] = ' ') THEN Min1[1] := '0';
- IF (Sek1[1] = ' ') THEN Sek1[1] := '0';
-
- INC(i);
-
- (* FALLS ALARMZEIT GEKOMMEN, TON + UHR *)
-
- IF (i = 6) THEN BEGIN
- x := WhereX; Y := Wherey;
- GetCursor;
- HideCursor;
- OldAttr := TextAttr;
- GotoXY(65, 1); TEXTATTR:=31;
- WriteLn(Std1, ':', Min1, ':', Sek1, ' Uhr');
- IF (Std = hh) AND (Min = mm) THEN BEGIN
- Sound(3200); Delay(25); NoSound;
- END ELSE
- Delay(10);
- GotoXY(x, y);
- ShowCursor;
- TextAttr := OldAttr;
- END;
-
- IF (i > 5) THEN i := 0;
-
- INLINE
- ($9C/ (* PUSHF ; INT 1C AKTIVIE- *)
- $3E/ (* DS ; REN. *)
- $FF/$1E/OLD_INT1); (* CALL FAR [OLD_INT1 1C] *)
- END;
-
- PROCEDURE Tast_Int; INTERRUPT;
- (* Hängt sich in den Tastatur-Interrupt
- und fragt die Zeit ab *)
- BEGIN
-
- (* Falls Hotkey noch nicht betätigt,
- Tastatureingabe über Hotkey *)
- IF ((Mem[$40:$17] AND 14) = 14) AND
- (Mem[$40:$FE] <> 98) THEN BEGIN
- Mem[$40:$FE] := 98;
- Write('Alarmzeit: [hh:mm] '); ReadLn(Str0);
- Val(Copy(Str0,1,2), hh, Res);
- Val(Copy(Str0,4,2), mm, Res);
- Taste(13, 0);
- Mem[$40:$FE] := 0;
- Exit;
- END;
-
- INLINE
- ($9C/ (* PUSHF ; INT 28h AKTIVIE- *)
- $3E/ (* DS ; REN. *)
- $FF/$1E/OLD_INT2); (* CALL FAR [OLD_INT2 28] *)
- END;
-
- BEGIN
- CheckBreak := False;
- WriteLn;
- i := 0;
-
- IF (Mem[$40:$FF] = 99) THEN BEGIN
- WriteLn('Programm wurde bereits installiert !');
- Halt(0);
- END ELSE
- Mem[$40:$FF] := 99;
-
- WriteLn('ALARM ist installiert.');
- Write('Alarmzeit: [hh:mm] '); ReadLn(Str0);
- Val(Copy(Str0, 1, 2), hh, Res);
- Val(Copy(Str0, 4, 2), mm, Res);
-
- GetIntVec($1C, @Old_Int1);
- SetIntVec($1C, @Time_Int);
- GetIntVec($28, @Old_Int2);
- SetIntVEc($28, @Tast_Int);
- Keep(0);
- END.
- (* ------------------------------------------------------ *)
- (* Ende von ALARM.PAS *)
-
-