home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TOOL_INC.ZIP / ATTACH.INC < prev    next >
Encoding:
Text File  |  1988-01-29  |  2.7 KB  |  103 lines

  1.  
  2. (*
  3.  * attach.inc - support to attach and de-attach interrupt traps
  4.  *
  5.  * (C) 1987 Samuel H. Smith, 30-May-87 (rev. 30-Aug-87)
  6.  *
  7.  *
  8.  * Usage:
  9.  *    {$i attach.inc}
  10.  *
  11.  *    const
  12.  *       old_21: longlink(ofs:0;seg:0);
  13.  *
  14.  *    procedure new_21(...);
  15.  *       interrupt;
  16.  *    begin
  17.  *       ENTER_INTERRUPT;
  18.  *       {do normal stuff}
  19.  *       LINK_CALL(old_21);   {call old handler if needed}
  20.  *       {do more normal stuff, beware segment changes}
  21.  *       LINK_JMP(old_21);    {exit this handler and jump to old one}
  22.  *       EXIT_INTERRUPT;      {exit this handler, ignore old one}
  23.  *   end;
  24.  *
  25.  *   initialize:
  26.  *      attach_handler($21,ofs(new_21),old_21);
  27.  *      ... handler is active
  28.  *      remove_handler($21,old_21);
  29.  *
  30.  *)
  31.  
  32. (*$R-,S-  range check and stack check off, this file only *)
  33.  
  34.  
  35. (* ------------------------------------------------------------ *)
  36. procedure get_handler(vector:      integer;     {vector number}
  37.                       var link:    longlink);   {cseg link to old handler}
  38.  
  39.    (* get a pointer to the current handler for an interrupt vector *)
  40. var
  41.    reg:  registers;
  42. begin
  43.  
  44. (* save the old interrupt handler's vector *)
  45.    reg.ax := $3500+vector;
  46.    msdos(reg);
  47.    link.seg := reg.es;
  48.    link.ofs := reg.bx;
  49. end;
  50.  
  51.  
  52. (* ------------------------------------------------------------ *)
  53. procedure attach_handler(vector:      integer;     {vector number}
  54.                          handler:     integer;     {cseg ofs of new handler}
  55.                          var link:    longlink);   {cseg link to old handler}
  56.  
  57.    (* attach an interrupt handler to the specified vector number;
  58.       handler is the cseg offset of the new handler; link will
  59.       contain a long pointer to the previous handler *)
  60. var
  61.    reg:  registers;
  62. begin
  63.  
  64. writeln('attach handler: stubbed; vector=',vector,' handler=',handler);
  65. halt(99);
  66.  
  67. (* save the old interrupt handler's vector *)
  68.    get_handler(vector,link);
  69.  
  70. (* install a vector to the new handler *)
  71.    reg.ax := $2500+vector;
  72.    reg.dx := handler;
  73.    reg.ds := cseg;
  74.    msdos(reg);
  75. end;
  76.  
  77.  
  78. (* ------------------------------------------------------------ *)
  79. procedure remove_handler(vector:      integer;     {vector number}
  80.                          var link:    longlink);   {cseg link to old handler}
  81.  
  82.    (* remove an interrupt handler and replace the old handler *)
  83. var
  84.    reg:  registers;
  85. begin
  86.  
  87. (* can't install old vector more than once *)
  88.    if (link.ofs = 0) and (link.seg = 0) then
  89.       exit;
  90.  
  91. (* install the old vector *)
  92.    reg.ax := $2500+vector;
  93.    reg.dx := link.ofs;
  94.    reg.ds := link.seg;
  95.    msdos(reg);
  96.  
  97. (* flag old vector as invalid *)
  98.    link.ofs := 0;
  99.    link.seg := 0;
  100. end;
  101.  
  102.  
  103.