home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 08 / tsr / tsr.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-06-03  |  3.3 KB  |  62 lines

  1. (* ----------------------------------------------------------------------- *)
  2. (*                             TSR.PAS                                     *)
  3. (* 'Terminiere und stay resident' Programm-Generator mit Re-Entry-Option!  *)
  4. (*  Anwenderprogramme werden als Prozedur von TSR.COM aufgefasst.          *)
  5. (* ----------------------------------------------------------------------- *)
  6. PROGRAM TSR_PAS;
  7. (*$C-*)                    (* keine Unterbrechung mit CTRL-C erlauben !!!! *)
  8. (*$I REGS8088.INC *)                       (* Register-Type des Prozessors *)
  9.  
  10. CONST      (* Scan-Code der Taste zum aktivieren des residenten Programms: *)
  11.    TSR_Char  = 113;                (* hier <Alt><F10>, nach Bedarf aendern *)
  12.    TSR_Int   = $60;                         (* Nummer des neuen Interrupts *)
  13.                          (* typisierte Konstanten = vorbesetzte Variablen: *)
  14.    Regs: Regs8088_ = (Ax:0;Bx:0;Cx:0;Dx:0;Bp:0;Si:0;Di:0;Ds:0;Es:0;Flags:0);
  15.    TSRDseg: INTEGER = 0;                               (* TSR Data Segment *)
  16.    TSRSseg: INTEGER = 0;                              (* TSR Stack Segment *)
  17.    DosSseg: INTEGER = 0;                              (* DOS Stack Segment *)
  18.    TSR_InUse : BOOLEAN = FALSE;                     (* Flag fuer Rekursion *)
  19.    TSR_IntIP : INTEGER = 0;                      (* urspruenglicher IP Int *)
  20.    TSR_IntCs : INTEGER = 0;                      (* urspruenglicher CS Int *)
  21.    StackSize : INTEGER = 0;
  22.  
  23. VAR
  24.    SaveRegs      : Regs8088_;
  25.    HalfRegs      : Regs8088_ ABSOLUTE Regs;
  26.    TSR_terminate : BOOLEAN;
  27.    Segm, Offs    : INTEGER;
  28.  
  29. (*$I MAKEINT.INC  *)                    (* Hilfsprozeduren aus PASCAL 6/87 *)
  30. (*$I TSRWIND.INC  *)                          (* einfaches Window-Handling *)
  31. (*$I REINSTAL.INC *)                       (* entfernt residentes Programm *)
  32. (*$I TSRPGM.INC   *)        (* Anwenderprogramm als parameterlose Prozedur *)
  33. (*$I INTERRPT.INC *)                                  (* Interrupt-Handler *)
  34.  
  35. BEGIN
  36.   TSR_InUse := FALSE;  TSR_terminate := FALSE;
  37.   TSRDseg := Dseg;                  (* Data Segment Adresse des Interrupts *)
  38.   TSRSseg := Sseg;                 (* Stack Segment Adresse des Interrupts *)
  39.   Segm := 0;
  40.   IntGet(TSR_Int,Segm,Offs);             (* Interrupt-Vektor Nr. $60 holen *)
  41.   IF Segm <> 0 THEN
  42.     WriteLn ('Interruptvector schon benutzt - Programm nicht resistent!')
  43.   ELSE
  44.     BEGIN
  45.                            (* Adresse des alten Keyboard-Interrupts holen: *)
  46.       IntGet(IntKeyBoard,Segm,Offs);
  47.                                         (* und als neuen Interrupt setzen: *)
  48.       IntSet(TSR_Int,Segm,Offs);
  49.         (* unsere Interrupt-Routine fuer den Keyboard-Interrupt einsetzen: *)
  50.       IntSet(IntKeyBoard,Cseg,Ofs(Interrpt));
  51.       TSR_IntIP := MemW[0:TSR_Int*4];                      (* Interrupt Ip *)
  52.       TSR_IntCs := MemW[0:TSR_Int*4+2];                    (* Interrupt Cs *)
  53.       WriteLn('  Turbo Pascal  Resident-Tool-Box');
  54.       WriteLn('  (C) 1987 Dietmar Bueckart & PASCAL INT.'); WriteLn;
  55.       WriteLn('  Druecke <Alt><F10> fuer Programmstart');   WriteLn;
  56.       (* Terminieren und resident machen. Ggfs. mAx free dynamic allocation
  57.          Option beim Compilieren aendern, wenn beim Aufruf des Programms
  58.          Fehler auftreten! 300-400 Paragraphen reichen im allgemeinen.     *)
  59.       MakeResident;
  60.     END;
  61. END.
  62.