home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* TSR.PAS *)
- (* 'Terminiere und stay resident' Programm-Generator mit Re-Entry-Option! *)
- (* Anwenderprogramme werden als Prozedur von TSR.COM aufgefasst. *)
- (* ----------------------------------------------------------------------- *)
- PROGRAM TSR_PAS;
- (*$C-*) (* keine Unterbrechung mit CTRL-C erlauben !!!! *)
- (*$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 TSRWIND.INC *) (* einfaches Window-Handling *)
- (*$I REINSTAL.INC *) (* entfernt residentes Programm *)
- (*$I TSRPGM.INC *) (* Anwenderprogramm als parameterlose Prozedur *)
- (*$I INTERRPT.INC *) (* Interrupt-Handler *)
-
- BEGIN
- TSR_InUse := FALSE; TSR_terminate := FALSE;
- TSRDseg := Dseg; (* Data Segment Adresse des Interrupts *)
- TSRSseg := Sseg; (* Stack Segment Adresse des Interrupts *)
- Segm := 0;
- IntGet(TSR_Int,Segm,Offs); (* Interrupt-Vektor Nr. $60 holen *)
- IF Segm <> 0 THEN
- WriteLn ('Interruptvector 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 *)
- WriteLn(' Turbo Pascal Resident-Tool-Box');
- WriteLn(' (C) 1987 Dietmar Bueckart & PASCAL INT.'); WriteLn;
- WriteLn(' Druecke <Alt><F10> fuer Programmstart'); WriteLn;
- (* 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.