home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SNAPSHOT.PAS *)
- (* Steuerprogramm von SNAPSHOT. Terminiert und bleibt *)
- (* resident *)
- (* -------------------------------------------------------*)
-
- PROGRAM SNAPSHOT;
-
- (*$C-*) (* keine Unterbrechung mit CTRL-C *)
- (*$I REGS8088.INC *) (* Register-Type des Prozessors *)
-
- CONST (* Scan-Code der Taste zum *)
- (* aktivieren des residenten *)
- (* Programms: *)
- TSR_Char = 113; (* hier <Alt><F10>, nach Bedarf *)
- (* aendern *)
- TSR_Int = $60; (* Nummer des neuen Interrupts *)
- (* typisierte Konstanten = *)
- (* vorbesetzte Variablen: *)
- Regs: Regs8088_ =
- (Ax:0;Bx:0;Cx:0;Dx:0;Bp:0;Si:0;Di:0;Ds:0;Es:0;Flags:0);
-
- TSRDseg: INTEGER = 0; (* TSR Data Segment *)
- TSRSseg: INTEGER = 0; (* TSR Stack Segment *)
- DosSseg: INTEGER = 0; (* DOS Stack Segment *)
- TSR_InUse : BOOLEAN = FALSE; (* Flag fuer Rekursion *)
- TSR_IntIP : INTEGER = 0; (* urspruenglicher IP Int *)
- TSR_IntCs : INTEGER = 0; (* urspruenglicher CS Int *)
- StackSize : INTEGER = 0;
-
- VAR
- SaveRegs : Regs8088_;
- HalfRegs : Regs8088_ ABSOLUTE Regs;
- TSR_terminate : BOOLEAN;
- Segm, Offs : INTEGER;
-
- (*$I MAKEINT.INC *) (* Hilfsprozeduren aus PASCAL 6/87 *)
- (*$I SCREENIO.INC *) (* Routinen fuer CGA [oder EGA/HGC] *)
- (*$I TSRINIT.INC *) (* Initialisierungsprozedur fuer *)
- (* ersten Aufruf *)
- (*$I TSRPGM.INC *) (* Anwenderprogramm als parameter- *)
- (* lose Prozedur *)
- (*$I INTERRPT.INC *) (* Interrupt-Handler *)
-
- BEGIN
- TSR_InUse := FALSE; TSR_terminate := FALSE;
- TSRDseg := Dseg;
- TSRSseg := Sseg;
- Segm := 0;
- IntGet(TSR_Int,Segm,Offs);
- (* Interrupt-Vektor Nr. $60 holen *)
- IF Segm <> 0 THEN
- WriteLn ('Interruptvektor schon benutzt',
- ' - Programm nicht resistent!')
- ELSE BEGIN
- (* Adresse des alten Keyboard-Interrupts holen: *)
- IntGet(IntKeyBoard,Segm,Offs);
- (* und als neuen Interrupt setzen: *)
- IntSet(TSR_Int,Segm,Offs);
- (* unsere Interrupt-Routine fuer den Keyboard- *)
- (* Interrupt einsetzen: *)
- IntSet(IntKeyBoard,Cseg,Ofs(Interrpt));
- TSR_IntIP := MemW[0:TSR_Int*4]; (* Interrupt Ip *)
- TSR_IntCs := MemW[0:TSR_Int*4+2]; (* Interrupt Cs *)
-
- TSRInit; (* Initialisierungen vornehmen *)
-
- (* Terminieren und resident machen. *)
- (* Ggfs. mAx free dynamic allocation-Option beim *)
- (* Compilieren aendern, wenn beim Aufruf des Programms *)
- (* Fehler auftreten! 300-400 Paragraphen reichen im *)
- (* allgemeinen. *)
-
- MakeResident;
- END;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von SNAPSHOT.PAS *)
-