home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_PAS / XLIB_TP5.ZIP / UNITS / X_BREAK.PAS < prev    next >
Pascal/Delphi Source File  |  1993-11-11  |  2KB  |  93 lines

  1. unit X_Break;
  2. (*
  3.     procedures to break a program and return to dos.
  4.  
  5.     ****** XLIB - Mode X graphics library                ****************
  6.     ******                                               ****************
  7.     ****** Written By Christian Harms                    ****************
  8.  
  9.     Harms   : harms@minnie.informatik.uni-stuttgart.de
  10.  
  11. *)
  12.  
  13. interface
  14. {$F+}
  15. type BreakProc = Procedure;
  16. {$F-}
  17. (* Leitet Ctrl+Break auf eigene Procedure P um. P muß mit {$F+} als eine   *)
  18. (* far-Procedure deklariert worden sein.                                   *)
  19. (* Init the Ctrl+Break-interrupt to your procedure. P have to far, this    *)
  20. (* means enclosed by {$F+} and {$F-}.                                      *)
  21. procedure InitBreak(P:BreakProc);
  22.  
  23. (* Für InitBreak eine Default-Procedure, um ein Programm zu beenden.       *)
  24. (* default Break-procedure to end your programm.                           *)
  25. procedure MyDummy;
  26.  
  27. (* Setzt den alten Ctrl+Break-Vektor wieder her. (Auch in INTR-Proc. drin) *)
  28. (* Set the old Ctrl+Break.                                                 *)
  29. procedure RestoreBreak;
  30.  
  31.  
  32. implementation
  33.  
  34. var OldBreakInt : LongInt;
  35.     MyBreak     : BreakProc;
  36.  
  37. (* Nach InitBreak(MyDummy); wird das aktuelle Programm nach Ctrl+Break ein- *)
  38. (* fach beendet.                                                            *)
  39. {$F+}
  40. procedure MyDummy;
  41. begin;
  42.   Halt;      (* Hier könnte zusätzlich noch z.B.: MyMouseDestroy;  stehen.  *)
  43. end;
  44. {$F-}
  45.  
  46. procedure RestoreBreak;    assembler;
  47. asm
  48.        xor  ax,ax
  49.        cmp  [offset OldBreakInt],ax
  50.        je  @raus
  51.        cmp  [offset OldBreakInt+2],ax
  52.        je  @raus
  53.  
  54.        push ds
  55.        mov  ax,[offset OldBreakInt  ]
  56.        mov  ds,ax
  57.        mov  dx,[offset OldBreakInt+2]
  58.        mov  ax,$251B
  59.        int  21h
  60.        pop  ds
  61. @raus:
  62. end;
  63.  
  64. procedure MyInt; interrupt;
  65. begin;
  66.   RestoreBreak;
  67.   MyBreak;
  68. end;
  69.  
  70. procedure InitBreak(P:BreakProc);
  71. begin;
  72.   asm
  73.        mov  ax,$351B       (* Get int 1B interrupt vector           *)
  74.        int  21h            (* Call dos                              *)
  75.        mov  [offset OldBreakInt  ],es
  76.        mov  [offset OldBreakInt+2],bx
  77.  
  78.        push ds
  79.        mov  ax,SEG MyInt
  80.        mov  ds,ax
  81.        mov  dx,OFFSet MyInt
  82.        mov  ax,$251B
  83.        int  21h
  84.        pop  ds
  85.   end;
  86.   MyBreak:=P;
  87. end;
  88.  
  89. begin;
  90.   OldBreakInt := 0;
  91.   MyBreak     := MyDummy;
  92. end.
  93.